Ниже приведен один из способов решения проблемы, но я не уверен, является ли он наиболее эффективным.
DECLARE @PivotData table(grade int, listening float, speaking float, reading float, writing float)
INSERT into @PivotData
SELECT 0, 0.0, 0.0, 0.0, 0.0 UNION ALL
SELECT 1, 399.4, 423.8, 0.0, 0.0 UNION ALL
SELECT 2, 461.6, 508.4, 424.4, 431.5 UNION ALL
SELECT 3, 501.0, 525.9, 492.8, 491.3
SELECT TestType, [0] As gr0, [1] as gr1, [2] as gr2, [3] as gr3
FROM
(
SELECT grade, TestType, score
FROM
(
SELECT grade, listening, speaking, reading, writing from @PivotData
) PivotData
UNPIVOT
(
score for TestType IN (listening, speaking, reading, writing)
) as initialUnPivot
) as PivotSource
PIVOT
(
max(score) FOR grade IN ([0], [1], [2], [3])
) as PivotedData
По сути, я сначала развернул данные, чтобы получить таблицу с оценкой, типом теста и оценкой каждого в отдельном столбце, затем я повернул данные, чтобы получить нужный ответ.Тот факт, что мои исходные данные UnPivoted содержат столбец TestType, делает так, что каждая комбинация оценки и тестового типа возвращает одну оценку, поэтому все агрегаты просто возвращают эту конкретную оценку для комбинации и ничего с ней не выполняют.1005 * Я сделал это только для первых 4 классов, но я уверен, что вы можете сказать, что вам нужно добавить, чтобы это работало для всех 13 классов.