sql >> Database >  >> RDS >> Sqlserver

Converteer rijen naar kolommen in SQL

U kunt de DRAAIEN tabeloperator om de rijen van de cijfers van deze cursus om te zetten in kolommen, zoals:

SELECT  
  Course, 
  [1] AS "Grade 1", 
  [2] AS "Grade 2", 
  [3] AS "Grade 3", 
  [4] AS "Grade 4"
FROM
(
  SELECT 
    Course, 
    Grade, 
    ROW_NUMBER() OVER(PARTITION BY Course 
                      ORDER BY COURSE) rownum 
  FROM Grades
) t
PIVOT 
(
   MAX(Grade)
   FOR rownum IN([1], [2], [3], [4])
) p;

SQL Fiddle-demo

Dit geeft je:

COURSE    GRADE 1   GRADE 2      GRADE 3     GRADE 4
  A         15        17          (null)     (null)
  B         12      (null)        (null)     (null)
  C         10        18            0           9

Let op: Ik heb de rangschikkingsfunctie ROW_NUMBER() met PARTITIE PER cursus om ze in vier klassen te verdelen. Zodat u ze vervolgens in deze vier groepen kunt groeperen.

Als je dit dynamisch moet doen, voor het geval er een onbekend aantal cijfers was. U kunt in dit geval dynamische SQL gebruiken om de lijst met cijfers als volgt dynamisch te genereren:

DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);

SELECT @cols = STUFF((SELECT distinct ',' 
                        + QUOTENAME('Grade ' 
                        + CAST(ROW_NUMBER() OVER(PARTITION BY Course 
                                               ORDER BY Course) AS VARCHAR(10)))
                FROM Grades
                         FOR XML PATH(''), TYPE
                      ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

SELECT @query = 'SELECT Course, ' + @cols +  
                'FROM
                 (
                   SELECT 
                     Course, 
                     Grade, 
                     ''Grade '' + CAST(ROW_NUMBER() 
                                       OVER(PARTITION BY Course 
                                ORDER BY COURSE) AS VARCHAR(10)) rownum 
                   FROM Grades
                 ) t
                 PIVOT 
                 (
                   MAX(Grade)
                   FOR rownum IN(' + @cols + ')' +
                ') p';
execute(@query);

Dynamische SQL Fiddle-demo




  1. Google brengt continue x-as in kaart vanuit php-array

  2. VB6 ADODB.Recordset RecordCount-eigenschap retourneert altijd -1

  3. Hoe output onderdrukken en controleren of een commando succesvol is?

  4. MYSQL_ROOT_PASSWORD is ingesteld maar krijgt toegang geweigerd voor gebruiker 'root'@'localhost' (met wachtwoord:YES) in docker-container