Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据字段值选择多行_Sql_Oracle_Case_Union - Fatal编程技术网

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