sql >> Database >  >> RDS >> Sqlserver

SQL-query om db-gegevens weer te geven

U wilt gegevens draaien - verander kolomgegevens in rijen. De ouderwetse manier is om CASE statements - vanaf SQL Server 2005 kunt u de gebruiken DRAAIEN opdracht. Ik laat het aan iemand anders over om het PIVOT-voorbeeld te geven.

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

Het is mij niet duidelijk wat het datatype is van de vraag geen kolom, update indien nodig.

Als gebruikers hun eigen vragen kunnen definiëren, moet u dynamische SQL gebruiken . U moet eerst een lijst met vraagnummers krijgen en vervolgens de CASE-statements maken op basis van die resultaten. Hetzelfde geldt voor 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)

De NULL FROM ... is omdat ik te lui ben om de komma te verwijderen die uit de laatste CASE-instructie zou komen.



  1. Uitvoeringsplan voor gepartitioneerde weergave

  2. Wat moet ik doen als ik databasebeperkingen wil gebruiken, maar alleen als verwijderd wil markeren in plaats van verwijderen?

  3. Hoe "Vind ik leuk" in SQL te gebruiken?

  4. Hoe hash ik het beheerderswachtwoord in mijn gebruikerstabel?