【问题标题】:How to SUM duplicate row in CASE statement calculation如何在 CASE 语句计算中对重复行求和
【发布时间】:2020-09-19 14:04:26
【问题描述】:

我有一个案例语句,它通过每个项目的标志计算分数,但分配给项目的用户。

它是合规/不合规项目的计数,我的问题是,如果一个项目在表中有 2 行,则将其计为 2 不合规,而它应该是 1。

这是基本的案例陈述:

SELECT 
    user.id,    
    sum( CASE WHEN SCORE_FLAG = 'Y' THEN 1 ELSE 0  END)  AS 'Compliant_Count',
    sum( CASE WHEN SCORE_FLAG = 'N' THEN 1 ELSE 0  END)  AS 'NonCompliant_Count',
    sum( CASE WHEN SCORE_FLAG = 'Y' or SCORE_FLAG = 'N' then 1 ELSE 0 END) AS 'Total_count'
FROM Table
Group By user.id

这是下面的无效结果(我在项目列中添加了 - 但这不会包含在我的查询中,因为我只按用户 ID 分组)。

usera   item1   0   1   1
usera   item2   0   2   2--
usera   item3   0   1   1
usera   item4   0   1   1

此用户有 4 个项目,但项目 2 在表中有 2 行,因此当我希望它为 1 时,它显示为 2 的不合规。

如何使用 case 语句将其拉回 1 行。我必须按用户而不是项目对结果进行分组,因为数据被加载到另一个只包含用户的表中。

第 2 项应该只有 1 个不合规计数和 1 个总计数

但是当我按用户对数据进行分组时,它应该如下所示:

Usera   0   4   4

Usera 应该有 4 个不合规项目,但目前我得到的计数是 5,因为其中一个项目有 2 行

【问题讨论】:

  • case expression - 这不是一个声明。
  • 您真正希望看到的结果是什么?
  • item 1,2 & 4 都可以,但是 item 2 应该是这样的:usera item2 0 1 1
  • 提供表格数据和预期结果
  • 评论不是该信息的正确位置,@Blowers。 edit你的问题。

标签: sql sql-server group-by count duplicates


【解决方案1】:

使用COUNT(DISTINCT) 而不是总和

例如

SELECT COUNT(DISTINCT CASE WHEN SCORE_FLAG = 'Y' THEN item ELSE NULL END)

【讨论】:

    【解决方案2】:

    我怀疑你想要distinct

    SELECT 
        user_id,    
        COALESCE(COUNT(DISTINCT CASE WHEN score_flag = 'Y' THEN item END), 0) AS Compliant_Count,
        COALESCE(COUNT(DISTINCT CASE WHEN score_flag = 'N' THEN item END), 0)  AS NonCompliant_Count,
        COUNT(DISTINCT CASE WHEN score_flag IN ('Y', 'N') THEN item END) AS Total_count
    FROM mytable
    GROUP BY user_id
    

    注意事项:

    • 查询中没有定义user表别名,所以user.id无效。我将其重命名为user_id
    • 不要对列别名使用单引号 - 单引号应仅用于字符串文字
    • 如果 Y 和 N 是唯一可能的值,则最后一个表达式可以简化为 COUNT(DISTINCT item)

    【讨论】:

    • 是的,成功了!感谢大家对此的帮助,并为我对问题的繁琐更新表示歉意:)
    猜你喜欢
    • 2022-06-22
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多