我需要生成一个输出类似于:
的查询CASE
WHEN s.grade_level IN (3,4,5,6,7,8,9,10,11,12) THEN
SELECT
s.lastfirst as NAME,
s.grade_level as GRADE,
'ELA' as SUBJECT
END
FROM students s
UNION ALL
CASE
WHEN s.grade_level IN (3,4,5,6,7,8,9,10,11,12) THEN
SELECT
s.lastfirst as NAME,
s.grade_level as GRADE,
'M' as SUBJECT
END
FROM students s
UNION ALL
CASE
WHEN s.grade_level IN (5,8,11) THEN
SELECT
s.lastfirst as NAME,
s.grade_level as GRADE,
'SCI' as SUBJECT
END
FROM students s
如果学生在5年级,8年级或11年级,该查询应为每位学生生成3行数据。等级3,4,6,7,9,10和12应该只产生2行数据。
我尝试过使用UNION ALL方法结合三个案例陈述,但这会给出一个' Missing Select关键字'错误。如果我从第一个UNION ALL及其下面的所有内容中删除所有内容,则查询的顶部部分可以正常运行。
有什么更好的解决方法?
for..else
答案 0 :(得分:1)
将数据放入表而不是查询中会更好。所以有与子喷气机有关的等级?有一个关于这种关系的表格:
<强> grade_subject 强>
grade subject 3 ELA 3 M 4 ELA 4 M 5 ELA 5 M 5 SCI 6 ELA 6 M ...
查询:
select
s.lastfirst as name,
s.grade_level as grade,
gs.subject as subject
from students s
join grade_subject gs on gs.grade = s.grade_level
order by s.lastfirst, gs.subject;
答案 1 :(得分:1)
{{1}}
虽然Throstens是正确的,但您可能应该具有等级的查找和关系表,以便可以在没有的情况下完成。你可以使用Common Table Expression [CTE]来创建主题,然后递归cte来生成成绩然后将它们连接在一起以获得你想要的2或3级成绩组合,然后简单地加入学生。