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