Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Преобразувайте редове в колони в SQL

Можете да използвате PIVOT табличен оператор, за да преобразува редовете на тези оценки на курса в колона, ето така:

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

Това ще ви даде:

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

Имайте предвид, че: Използвах функцията за класиране ROW_NUMBER() с PARTITION BY Course да ги разделим на четири степени. За да можете след това да ги групирате в тези четири групи.

Ако трябва да направите това динамично, в случай че има неизвестен брой оценки. Можете да използвате динамичен SQL в този случай, за да генерирате динамично списъка с оценки по следния начин:

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

Демонстрация на Dynamic 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. Регистърът на транзакциите на SQL Server, част 2:Архитектура на журнала

  2. По-елегантен начин за избягване на динамичен SQL?

  3. R:[unixODBC][Диспечер на драйвери]Не може да се отвори библиотеката „SQL Server“:файлът не е намерен

  4. Получаване на текущата дата в SQL Server?

  5. SQL Server - Транспониране на редове в колони