首页 > 解决方案 > Mysql 计算 Sum(if()) 中的不同 ID

问题描述

我有下表。

案子

ID 姓名
1 安东
2 埃尔弗里德
3 欧司朗

约会

ID 期间 案子
1 70 1
2 70 2

没有预约的 Fastdocu

ID 期间 案子
1 15 2
2 15 2
3 50 3
3 8 3

我需要总结所有持续时间和所有约会以及不在约会中的案例。

结果应该是

时长 88
预约 3
案例 1

以下我写的声明

Select sum(duration), count(DISTINCT ID), SUM(IF(`Case` NOT IN (1,2),1,0)) From Fastdocu

结果一下子就出来了

时长 88
预约 3
案例 2

我必须在案例计数中仅对不同的 id 求和。但是 if 中似乎禁止了 distinct 。我怎样才能正确计算案件?

标签: mysql

解决方案


COUNT()与表达式一起使用,CASE而不是SUM()

SELECT SUM(duration) total_duration, 
       COUNT(DISTINCT ID) distinct_ids, 
       COUNT(DISTINCT CASE WHEN `Case` NOT IN (1,2) THEN `Case` END) cases_not_in_Appointments 
FROM Fastdocu

由于COUNT()没有ELSE分支,它不会计算Case不满足条件的 s,Case NOT IN (1,2)因为在这种情况下,CASE表达式的结果将是NULL

如果要计算 distinct ids 而不是 distinct Cases 更改为:

COUNT(DISTINCT CASE WHEN `Case` NOT IN (1,2) THEN ID END) 

请参阅演示
结果:

总持续时间 distinct_ids case_not_in_Appointments
88 3 1

推荐阅读