Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête SQL pour afficher les données de la base de données

Vous cherchez à faire pivoter les données - changez les données en colonnes en lignes. La méthode à l'ancienne consiste à utiliser CASE instructions - à partir de SQL Server 2005, vous pouvez utiliser PIVOT commande. Je laisserai à quelqu'un d'autre le soin de fournir l'exemple PIVOT.

SELECT t.memberid,
       CASE WHEN t.questionno = 1 THEN t.answerno ELSE NULL END AS 1,
       CASE WHEN t.questionno = 2.1 THEN t.answerno ELSE NULL END AS 2.1,
       CASE WHEN t.questionno = 2.2 THEN t.answerno ELSE NULL END AS 2.2,
       CASE WHEN t.questionno = 3 THEN t.answerno ELSE NULL END AS 3
       CASE WHEN t.questionno = 5 THEN t.answerno ELSE NULL END AS 5
       CASE WHEN t.questionno = 7 THEN t.answerno ELSE NULL END AS 7
  FROM ANSWER t

Le type de données de la colonne questionno n'est pas clair pour moi, mettez-le à jour si nécessaire.

Si les utilisateurs peuvent définir leurs propres questions, vous devez utiliser SQL dynamique . Vous devrez d'abord obtenir une liste de questions, puis construire les instructions CASE en fonction de ces résultats. De même pour PIVOT...

DECLARE @SQL nvarchar(4000)
DECLARE @questionno [data type here]

SET @SQL = 'SELECT t.memberid,'

DECLARE c1 CURSOR READ_ONLY FOR
  SELECT t.questionno
    FROM ANSWER t
GROUP BY t.questionno
ORDER BY t.questionno

OPEN c1

FETCH NEXT FROM c1 INTO @questionno 

WHILE @@FETCH_STATUS = 0
BEGIN

  SET @SQL = @SQL + ' CASE WHEN t.questionno = '+ @questionno +' THEN t.answerno ELSE NULL END AS '+ @questionno','

  FETCH NEXT FROM c1 INTO @questionno 
END

CLOSE c1
DEALLOCATE c1

SET @SQL = @SQL + 'NULL FROM ANSWER t '

EXEC(@SQL)

Le NULL FROM ... c'est parce que je suis trop paresseux pour me débarrasser de la virgule qui viendrait de la dernière instruction CASE.