【发布时间】:2017-08-18 10:33:39
【问题描述】:
我正在使用以下 SQL(使用 SQL Server 2016)从我们的 LMS (Moodle) 中透视测试结果列表:
SELECT *
FROM
(SELECT
u.firstname AS name,
u.lastname AS last_name,
u.idnumber AS id_number,
gi.itemname AS exam_name,
CAST(gg.finalgrade / gi.grademax * 100 AS integer) AS grade
FROM
mdl_grade_grades gg
INNER JOIN
mdl_grade_items gi ON gg.itemid = gi.id
INNER JOIN
mdl_course c ON gi.courseid = c.id
INNER JOIN
mdl_user u ON gg.userid = u.id
WHERE
(gi.itemname IS NOT NULL)
AND (gi.courseid = 123)) SOURCE
PIVOT
(MAX(grade)
FOR exam_name IN ([Exam ABC], [Exam DEF], [Exam GHI],
[Exam JKL], [Exam XYZ])
) PIVT
ORDER BY
id_number
结果将是:
name last name id number division region branch Exam ABC Exam DEF Exam GHI Exam JKL Exam XYZ
John Tester 3343664 ABC WEST RGN A AGY 65 44
Kenny Quipton 4342423 DDA CENTRAL RGN FRN 88 66 90 89
Molefi Manase 5456545 CCS ABC RGN XXX SOL 74 90 85 80 77
对此我唯一的问题是考试名称必须在FOR IN(...) 列表中进行硬编码,因此每次更改列表时都必须手动更新。
这个 SQL 可以用动态 SQL 重写吗?
什么更好 - 使用 Stuff() 或 FOR XML PATH,或其他什么?
我不能使用存储过程(应用程序不支持它们)。
【问题讨论】:
-
请从所有使用的表中发布示例数据
标签: sql-server pivot