【问题标题】:set operator minus not showing results设置运算符减去不显示结果
【发布时间】:2013-10-30 23:40:45
【问题描述】:

我在这里尝试将 SECTION_ID 计为 SECTIONS 并将 ENROLL_DATE 计为 STUDENTS,我从学生列中获得了正确的结果,但不是从部分列。我只想要 SECTION 表中的 SECTION_ID 而不是 ENROLLMENT 表中的,所以我做了减集操作。为什么它给我两个表的结果?我怎么能只从 SECTION 表中得到结果?

 SELECT s.LOCATION,COUNT(s.SECTION_ID) AS SECTIONS, COUNT(e.ENROLL_DATE) AS STUDENTS
 FROM SECTION s
 JOIN ENROLLMENT e
 ON s.SECTION_ID = e.SECTION_ID
 WHERE EXISTS (

           SELECT SECTION_ID
           FROM SECTION
            MINUS
           SELECT SECTION_ID
           FROM ENROLLMENT

            )
 AND s.SECTION_ID = e.SECTION_ID
 GROUP BY s.LOCATION
 ORDER BY s.LOCATION;

我得到了这个结果

 LOCATION  SECTIONS   STUDENTS
 ---------- ---------- ----------
   H310        1        1
   L206        8        8
   L210        29       29
   L211        10       10
   L214        36       36
   etc

我想要的结果

 LOCATION  SECTIONS   STUDENTS
 ---------- ---------- ----------
   H310        1        1
   L206        1        8
   L210        10       29
   L211        3        10
   L214        15       36
   etc

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    如果没有产生这些结果的示例数据,很难说,但我认为您可能想要计数不同:

    Select
        s.location,
        count(distinct s.section_id) as sections,
        count(e.enroll_date) as students
    from
       section s
           inner join
       enrollment e
           on s.section_id = e.section_id
    group by
        s.location
    order by
        s.location;
    

    您的存在标准可能没有达到您的预期,因为内部和外部之间没有相关性。您还在 join 和 where 子句中重复了 s.section_id = e.section_id

    【讨论】:

    • 你得到了正确的结果......所以我基本上不需要减集操作。我喜欢你的风格,这将帮助我做我需要的其他事情......谢谢!
    • 是的 - count(*) 计算结果集中的所有行,count(column) 计算具有非空列的行数,count(distinct column) 计算结果集中不同的非空值的数量结果集。
    【解决方案2】:

    我最初的想法是你想要独特的关键字......

    像这样:

     SELECT s.LOCATION,
            COUNT(DISTINCT s.SECTION_ID) AS SECTIONS, 
            COUNT(e.ENROLL_DATE) AS STUDENTS
     FROM SECTION s
     JOIN ENROLLMENT e
     ON s.SECTION_ID = e.SECTION_ID
     WHERE EXISTS (    
               SELECT SECTION_ID
               FROM SECTION
                MINUS
               SELECT SECTION_ID
               FROM ENROLLMENT    
                )
     AND s.SECTION_ID = e.SECTION_ID
     GROUP BY s.LOCATION
     ORDER BY s.LOCATION;
    

    【讨论】:

    • 所以基本上我有重复的嗯
    • @Dana,您多次计算同一个会话。例如,如果学生 1、2 和 3 注册了第 1 部分:您将有 3 条记录(学生,部分 | 1,1 | 2,1 | 3,1)在计算学生时有效,但它同一个部分被计算了多次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    相关资源
    最近更新 更多