【问题标题】:How to combine 2 result sets如何组合 2 个结果集
【发布时间】:2021-01-18 16:58:50
【问题描述】:

为了解决以下问题,我想使用 SQL 组合 2 个结果集(查询 #1 + 查询 #2)。 我试过 UNION 但它没有用。救命!


问题:


样本数据:

查询 #1:

SELECT 
    COUNT(student_id),
    MAX(registration_date),
    MAX(lab1)
FROM grades;

查询 #1 结果:

查询 #2:

SELECT 
    MAX(SUM(NVL(lab1, 0) + NVL(lab2, 0)))
FROM grades
GROUP BY student_id;

查询 #2 结果:

【问题讨论】:

  • 为什么在第二个查询中按 student_id 分组?您没有在查询选择器中使用 student_id
  • 解释“组合”。解释一下这段代码是什么。
  • use text, not images/links, for text--including tables & ERDs。仅将图像用于无法表达为文本或增强文本的内容。在图片中包含图例/键和说明。
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。

标签: sql join merge union


【解决方案1】:

您进行了几次下降尝试。如果您可以编辑您现有的帖子并提供一些示例数据,将有助于更好地向我们展示基本的基础是什么。每个 lab1 和/或 lab2 是否有多行。是否有多个班级代表?你想要一个总和,但做一个最大值?

您需要按学生分组,以便每个学生展示自己的作品。所以你有那个。你也有 max(),还有 sum()。所以希望这将接近你所需要的。

SELECT 
      g.student_id,
      max( g.registration_date ) NewestRegistrationDate,
      max( coalesce( g.lab1, 0 )) HighestLab1,
      max( coalesce( g.lab2, 0 )) HighestLab2,
      max( coalesce( g.lab1, 0 )) 
        + max( coalesce( g.lab2, 0 )) HighestBothLabs
   FROM 
      grades g
   group by
      g.student_id

至少以上内容将为您提供网格图像所代表的每个学生的基础,而不是显然需要总学生和总体最高成绩的最终答案。那个,你想要count(),并忽略group by,因为你想要整个集合的答案。但是你想要每个实验室类别中最高的吗?或者每个学生最高的学生的总实验室数。

前:

Student   Lab1   Lab2   Total
1         75     92     167
2         74     100    174

这里,你有两个学生。第一个具有最高的lab1,但第二个具有最高的总数。你需要做出这个决定,或者至少得到老师的澄清。如果您想要实验室 1 的最高值,您可能需要将第一个查询包装到第二个查询中。但这也可能超出了您正在学习的内容。使用一个结果作为外部诸如的基础。

select
      count(*) TotalStudents,
      Max( PerStudent.NewestRegistrationDate ) MostRecentRegistrationDate,
      Max( PerStudent.HighestLab1 ) HighestFirstLab,
      Max( PerStudent.HighestBothLabs ) HighestAllLabs
   from
      (     SELECT 
                  g.student_id,
                  max( g.registration_date ) NewestRegistrationDate,
                  max( coalesce( g.lab1, 0 )) HighestLab1,
                  max( coalesce( g.lab2, 0 )) HighestLab2,
                  max( coalesce( g.lab1, 0 )) 
                    + max( coalesce( g.lab2, 0 )) HighestBothLabs
               FROM 
                  grades g
               group by
                  g.student_id ) PerStudent

内部预查询(别名 PerStudent)将数据保留在每个学生级别,为您提供在没有分组依据的 OUTER 查询级别获得最高 per 的基础。但至少首先运行第一个查询以确认数据的基线。如果你没有那个正确的,那么外部也没有意义。

【讨论】:

  • 谢谢,但我只需要对查询 #2 使用“GROUP BY”。因为我应该显示1)学生人数,2)最近的数据注册日期,3)所有学生中lab1的最高学位,4)所有学生中总学位(lab1 + lab2)的最高。
  • @zzanzzani,修改后的答案。并且为了将来,不要粘贴图像。最好只键入数据并使用空格进行对齐,就像我为两个学生准备的样本一样。
  • 嘿,感谢您成为我在 Stackoverflow 上的第一位老师!我解决了!!
  • @zzanzzani,如果这有助于您找到解决方案,请务必检查/勾选答案,以便其他人知道它已解决,这就是帮助您解决问题的原因。所以未来,有类似问题的其他人知道什么是有效的——或者至少显着让你到达那里。
【解决方案2】:

感谢 DRapp,我用下面的代码解决了这个问题。

SELECT
    COUNT(*) TotalStudents,
    MAX(PerStudent.MostRecentRegistrationDate) MostRecentRegistrationDate,
    MAX(PerStudent.HighestFirstLab) HighestFirstLab,
    MAX(PerStudent.SumBothLabs) HighestBothLabs
FROM
    (SELECT
        MAX(g.registration_date) MostRecentRegistrationDate,
        MAX(coalesce(g.lab1, 0)) HighestFirstLab,
        SUM(coalesce(g.lab1, 0) + coalesce(g.lab2, 0)) SumBothLabs
    FROM grades g
    GROUP BY g.student_id) PerStudent;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多