sql—case语句计算中重复行的求和方法

w8biq8rn  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(568)

我有一个case语句,它通过每个项目的标志来计算分数,但分配给项目的用户。
它是一个符合/不符合项的计数,我的问题是,如果一个项在表中有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

这是下面的无效结果(我在item列中添加了-但这不会包含在我的查询中,因为我只按用户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行

oxf4rvwz

oxf4rvwz1#

我怀疑你想 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)

jckbn6z7

jckbn6z72#

使用 COUNT(DISTINCT) 而不是一个总数
例如

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

相关问题