【问题标题】:SQL to group by and select a column when not nullSQL分组并在不为空时选择一列
【发布时间】:2018-07-05 16:12:47
【问题描述】:

所以我有一张这样的桌子:

ID  DESCRIPTION  AGROUP
-----------------------
1   AN  
2   FI  
3   DOC 1        DOC
4   DOC 2        DOC
5   CO  
6   RI           RI

如果 AGROUP 列不为空,我想按该值进行选择和分组,否则选择DESCRIPTION;在任何情况下按 ID 排序。我想要的结果是:

ID  RESULT
-----------------------
1   AN  
2   FI  
3   DOC
5   CO  
6   RI

我尝试先创建一个子查询,使用

SELECT 
  DISTINCT (NVL(AGROUP, DESCRIPTION)) AS DES 
FROM 
  temp
GROUP BY NVL(AGROUP, DESCRIPTION)

然后添加外部查询:

SELECT 
    ID,
    DES 
FROM
(
    SELECT DISTINCT (NVL(AGROUP, DESCRIPTION)) AS DES 
        FROM 
    temp
        GROUP BY NVL(AGROUP, DESCRIPTION) 
) T1
JOIN TEMP T2 ON (T1.DES = T2.AGROUP OR T1.DES = T2.DESCRIPTION)
ORDER BY ID
;

但后来我收到了两次 DOC:

1   AN
2   FI
3   DOC
4   DOC
5   CO
6   RI

SQL 让我头疼! 谢谢。

【问题讨论】:

    标签: sql


    【解决方案1】:

    我想你只是想要group by:

    select coalesce(AGROUP, DESCRIPTION) AS DES, min(id) as id
    from  temp
    group by coalesce(AGROUP, DESCRIPTION);
    

    【讨论】:

    • 天哪!合并!!
    • @vulkanino 。 . .我对 ANSI 标准功能有强烈的偏好,除非有充分的理由偏离。
    • 你是对的@Gordon,我只是注意到它是多么简单的解决方案,我找不到它。谢谢。
    【解决方案2】:

    试试这个代码

    SELECT 
    DISTINCT (DESCRIPTION)) AS DES 
    FROM 
    temp
    where AGROUP IS NOT NULL
    GROUP BY (AGROUP, DESCRIPTION)
    

    【讨论】:

    • 不,这不符合要求,您只选择 group 不为空的行。
    猜你喜欢
    • 2022-10-09
    • 1970-01-01
    • 2020-10-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    相关资源
    最近更新 更多