【问题标题】:GROUP BY SUM CASE expressionGROUP BY SUM CASE 表达式
【发布时间】:2020-02-05 17:03:57
【问题描述】:

我想按帐号分组,但如果我为一个帐户获得多个 RATE_CD,我会遇到问题 - 我的 NONCOMPLIANT_CNT 为 2,但我希望每个帐户只有 1 个,即使有超过 1 个RATE_CD。

以下是我正在使用的 SQL,关于如何返回每个帐户的 NONCOMPLIANT_CNT 以及如果有超过 1 个 RATE_CD 时不汇总计数的任何想法?

SELECT ID
    ,ACCOUNT_NBR SUM(CASE 
            WHEN GROUP_CD = 'RED'
                AND TYPE_CD IN ('CHK')
                THEN 1
            ELSE 0
            END) AS 'COMPLIANT_CNT'
    ,SUM(CASE 
            WHEN GROUP_CD = 'RED'
                AND TYPE_CD IN (
                    'CN'
                    ,'RN'
                    )
                AND RATE_CD <> 'BLK'
                THEN 1
            ELSE 0
            END) AS 'NONCOMPLIANT_CNT'
    ,SUM(CASE 
            WHEN GROUP_CD = 'RED'
                AND TYPE_CD IN (
                    'CN'
                    ,'RN'
                    ,'CHK'
                    )
                THEN 1
            ELSE 0
            END) AS 'TOTAL_CNT'
FROM DETAIL
LEFT OUTER JOIN RATE_LOOKUP ACCOUNT_NBR = ACCOUNT_NBR
GROUP BY ID
    ,ACCOUNT_NBR
    ,RATE_CD

【问题讨论】:

  • CASE 表达式Case (Switch) 语句在 SQL Server 中不存在。 CASE 表达式返回标量值,而不是布尔结果。
  • 看起来你真正追求的是COUNT(DISTINCT ... Account_NBR而不是SUM(...1)
  • 另外,为什么ACCOUNT_NBR=ACCOUNT_NBR 上有一个LEFT JOINACCOUNT_NBR什么时候会等于ACCOUNT_NBR的值?只需使用 CROSS JOIN RATE_LOOKUP 代替。 (除非RATE_LOOKUP 出于某种原因不会包含行?)
  • 请提供样本数据和期望的结果。

标签: sql sql-server group-by sum case


【解决方案1】:

如果您只想要 1 而不是实际数量,请将 SUM() 更改为 MAX()。因此,如果它们有 5 个条目,它仍将显示为至少 1,否则对于给定的列聚合将显示为 0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2020-04-01
    • 2021-02-09
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多