Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chuyển đổi hàng thành cột trong SQL

Bạn có thể sử dụng PIVOT toán tử bảng để thực hiện chuyển đổi các hàng của điểm của khóa học này thành cột, như sau:

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;

Bản trình diễn SQL Fiddle

Điều này sẽ cung cấp cho bạn:

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

Lưu ý rằng: Tôi đã sử dụng chức năng xếp hạng ROW_NUMBER() với PARTITION BY Course để phân chia chúng thành bốn cấp. Vì vậy, bạn có thể nhóm chúng thành bốn nhóm sau.

Nếu bạn cần điều này một cách linh hoạt, trong trường hợp có số điểm không xác định. Bạn có thể sử dụng SQL động trong trường hợp này để tạo danh sách các lớp một cách động như sau:

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

Demo Fiddle SQL động




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hạn chế quyền truy cập Đăng nhập máy chủ SQL vào chỉ một cơ sở dữ liệu

  2. CTE vòng lặp vô hạn với TÙY CHỌN (maxrecursion 0)

  3. Quyền truy cập chỉ đọc vào nội dung thủ tục được lưu trữ

  4. SQL Server, tìm một chuỗi giá trị tùy ý

  5. chọn một hàng cho mỗi ID