どうすれば次のことができますか?
質問する
16298 次
1 に答える
4
次のように、表演算子を使用して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 フィドルのデモ
これにより、次のことが得られます。
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
を 4 つのグレードに分割しました。これらの 4 つのグループにグループ化できるようにします。
これを動的に行う必要がある場合は、不明な数の成績があった場合に備えてください。この場合、動的 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);
動的 SQL フィドルのデモ
于 2012-12-01T20:35:55.073 に答える