【发布时间】: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 JOIN?ACCOUNT_NBR不什么时候会等于ACCOUNT_NBR的值?只需使用CROSS JOIN RATE_LOOKUP代替。 (除非RATE_LOOKUP出于某种原因不会包含行?) -
请提供样本数据和期望的结果。
标签: sql sql-server group-by sum case