Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Konwertuj wiersze na kolumny w SQL

Możesz użyć PIVOT operator tabeli, który przekształci wiersze ocen z tego kursu na kolumny, na przykład:

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;

Pokaz SQL Fiddle

To da ci:

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

Pamiętaj, że: Użyłem funkcji rankingu ROW_NUMBER() z PARTITION BY Course podzielić je na cztery stopnie. Aby można było je następnie pogrupować w te cztery grupy.

Jeśli potrzebujesz to dynamicznie, w przypadku niewiadomej liczby ocen. W tym przypadku możesz użyć dynamicznego SQL, aby dynamicznie wygenerować listę ocen, tak jak poniżej:

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);

Prezentacja dynamicznego SQL Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakie zasoby są dostępne dla dostrajania wydajności bazy danych?

  2. Jak zmienić kolumnę z wartości Null na Not Null w SQL Server

  3. Oświadczenie się skończyło. Maksymalna rekurencja 100 została wyczerpana przed zakończeniem instrukcji

  4. Zwróć uprawnienia kolumny z serwera połączonego w programie SQL Server (przykłady T-SQL)

  5. Napraw problem oczekujący na odzyskanie bazy danych SQL z odmową dostępu