根据字段值选择多行

时间:2016-09-16 20:31:28

标签: sql oracle case union

我需要生成一个输出类似于:

的查询
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

2 个答案:

答案 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级成绩组合,然后简单地加入学生。