Sql 根据字段值选择多行
我需要生成一个输出如下内容的查询:Sql 根据字段值选择多行,sql,oracle,case,union,Sql,Oracle,Case,Union,我需要生成一个输出如下内容的查询: NAME GRADE SUBJECT Smith, Shirley 3 ELA Smith, Shirley 3 M Jones, John 5 ELA Jones, John 5 M Jones, John 5 SCI 如果一个学生在5、
NAME GRADE SUBJECT
Smith, Shirley 3 ELA
Smith, Shirley 3 M
Jones, John 5 ELA
Jones, John 5 M
Jones, John 5 SCI
如果一个学生在5、8或11年级,查询应该为每个学生生成3行数据。等级3、4、6、7、9、10和12应该只生成两行数据
我曾尝试使用UNIONALL方法结合三个case语句,但这会导致“缺少Select关键字”错误。如果我从第一个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,
'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
最好将数据放在表中,而不是放在查询中。那么有与科目相关的分数吗?为该关系创建一个表,然后: 大学二年级科目
最好将数据放在表中,而不是放在查询中。那么有与科目相关的分数吗?为该关系创建一个表,然后: 大学二年级科目 虽然Throstens是正确的,但您可能应该有查找表和关系表,以便将年级与主题关联起来,而无需使用。您可以使用公共表表达式[CTE]创建科目,然后使用递归CTE生成成绩,然后将它们连接在一起,以获得所需的2或3个科目到成绩的组合,然后简单地将学生连接到该组合中
虽然Throstens是正确的,但您可能应该有查找表和关系表,以便将年级与主题关联起来,而无需使用。您可以使用公共表表达式[CTE]创建科目,然后使用递归CTE生成成绩,然后将它们连接在一起,以获得所需的2或3个科目到成绩的组合,然后简单地将学生连接到该组合中。非常好的sql-谢谢。我不得不稍微修改它,cteGrades AS语句正在生成ORA-32039:recursive WITH子句必须有列别名列表,我用cteGrades grade_level AS解析了该列表。。。我同意首选Throsten的答案,但我们并不总是处理一个可以编辑模式的数据库,就像我的情况一样。我需要找到一个基于sql的解决方案,而不是关于如何更改数据库的建议。Matt的解决方案非常有效。sql非常好-谢谢。我不得不稍微修改它,cteGrades AS语句正在生成ORA-32039:recursive WITH子句必须有列别名列表,我用cteGrades grade_level AS解析了该列表。。。我同意首选Throsten的答案,但我们并不总是处理一个可以编辑模式的数据库,就像我的情况一样。我需要找到一个基于sql的解决方案,而不是关于如何更改数据库的建议。马特的解决方案非常有效。 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;
WITH cteSubjects AS (
SELECT 'ELA' AS Subject FROM dual
UNION ALL
SELECT 'M' FROM dual
UNION ALL
SELECT 'SCI' FROM dual
)
, cteGrades AS (
SELECT 3 as grade_level
FROM dual
UNION ALL
SELECT c.grade_level + 1
FROM
cteGrades c
WHERE c.grade_level + 1 <= 12
)
SELECT *
FROM
cteGrades g
INNER JOIN cteSubjects s
ON (CASE
WHEN g.grade_level IN (5,8,11) AND s.Subject = 'SCI' THEN 1
WHEN s.Subject <> 'SCI' THEN 1
ELSE 0
END) = 1
INNER JOIN students s
ON g.grade_level = s.grade_level