sql >> Database teknologi >  >> RDS >> Sqlserver

SQL-forespørgsel til at vise db-data

Du ønsker at pivotere data - ændre kolonnedata til rækker. Den gamle måde er at bruge CASE sætninger - fra og med SQL Server 2005 kan du bruge PIVOT kommando. Jeg vil overlade det til en anden at give PIVOT-eksemplet.

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

Det er ikke klart for mig, hvad datatypen for spørgsmålskolonnen er, opdater, så den passer, hvis det er nødvendigt.

Hvis brugere kan definere deres egne spørgsmål, skal du bruge dynamisk SQL . Du skal først få en liste over spørgsmålsnumre og derefter konstruere CASE-udsagnene baseret på disse resultater. Ligeledes for 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)

NULL FROM ... er fordi jeg er for doven til at slippe af med kommaet, der ville komme fra den sidste CASE-udsagn.



  1. Hvordan kan jeg få fremmednøglerne til en tabel i mysql

  2. Fjernforbindelse til en MySQL-database

  3. Hvorfor er udførelsestiden for oracle-lagrede procedurer stærkt forøget afhængigt af, hvordan den udføres?

  4. Referencealias i WHERE-klausulen