【问题标题】:Group and exclude rows that had empty values aggregated - oracle sql分组并排除聚合了空值的行 - oracle sql
【发布时间】:2022-01-12 02:36:33
【问题描述】:

我有一个看起来像这样的 oracle sql 表

"STUDENT_ID","FULL_NAME","SEMESTER_ID","STIP_ID"
"1","Liam Bottrill","1","1"
"1","Liam Bottrill","2","3"
"1","Liam Bottrill","3","2"
"1","Liam Bottrill","4","5"
"2","Maurits Smitham","1","6"
"2","Maurits Smitham","2",""
"2","Maurits Smitham","3","2"
"2","Maurits Smitham","4","6"
"43","Jackie Cotton","1",""
"43","Jackie Cotton","2",""
"43","Jackie Cotton","3",""
"43","Jackie Cotton","4",""

我想按“STUDENT_ID”对该表进行分组,并从结果中排除任何“STIP_ID”行为空的学生

我的目标是这样的:

"STUDENT_ID","FULL_NAME"
"1","Liam Bottrill"

应显示 Liam Bottrill,而应从结果中排除 Maurits Smitham 和 Jackie Cotton

你能帮我解决这样的聚合函数吗?

【问题讨论】:

    标签: sql oracle group-by


    【解决方案1】:

    这是一种方法,使用聚合:

    SELECT *
    FROM yourTable
    WHERE STUDENT_ID IN (
        SELECT STUDENT_ID
        FROM yourTable
        GROUP BY STUDENT_ID
        HAVING COUNT(CASE WHEN STIP_ID IS NULL THEN 1 END) = 0
    );
    

    另一种方式,使用存在逻辑:

    SELECT t1.*
    FROM yourTable t1
    WHERE NOT EXISTS (
        SELECT 1
        FROM yourTable t2
        WHERE t2.STUDENT_ID = t1.STUDENT_ID AND
              t2.STIP_ID IS NULL
    );
    

    【讨论】:

    • 谢谢先生,当我的课程作业截止日期还有 10 小时时,你真的救了我(:
    【解决方案2】:

    您可以按标识符分组,然后使用条件聚合查找STIP_ID 时计数为NULL(在Oracle 中与空字符串相同)的学生:

    SELECT student_id,
           MAX(full_name) AS full_name
    FROM   table_name
    GROUP BY student_id
    HAVING COUNT(CASE WHEN stip_id IS NULL THEN 1 END) = 0;
    

    其中,对于您的示例数据:

    CREATE TABLE table_name (STUDENT_ID, FULL_NAME, SEMESTER_ID, STIP_ID) AS
    SELECT  1, 'Liam Bottrill',   1, 1 FROM DUAL UNION ALL
    SELECT  1, 'Liam Bottrill',   2, 3 FROM DUAL UNION ALL
    SELECT  1, 'Liam Bottrill',   3, 2 FROM DUAL UNION ALL
    SELECT  1, 'Liam Bottrill',   4, 5 FROM DUAL UNION ALL
    SELECT  2, 'Maurits Smitham', 1, 6 FROM DUAL UNION ALL
    SELECT  2, 'Maurits Smitham', 2, NULL FROM DUAL UNION ALL
    SELECT  2, 'Maurits Smitham', 3, 2 FROM DUAL UNION ALL
    SELECT  2, 'Maurits Smitham', 4, 6 FROM DUAL UNION ALL
    SELECT 43, 'Jackie Cotton',   1, NULL FROM DUAL UNION ALL
    SELECT 43, 'Jackie Cotton',   2, NULL FROM DUAL UNION ALL
    SELECT 43, 'Jackie Cotton',   3, NULL FROM DUAL UNION ALL
    SELECT 43, 'Jackie Cotton',   4, NULL FROM DUAL;
    

    输出:

    STUDENT_ID FULL_NAME
    1 Liam Bottrill

    db小提琴here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2021-02-25
      • 2023-01-20
      • 1970-01-01
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多