同一个 SQL 语句中的多个条件计数 [重复]

Posted

技术标签:

【中文标题】同一个 SQL 语句中的多个条件计数 [重复]【英文标题】:Multiple conditional counts in the same SQL sentence [duplicate] 【发布时间】:2018-08-20 19:42:17 【问题描述】:

目标是在考虑每个任务的状态的情况下获得任务列表的进度,排除无效任务。

目前,我设法以非常昂贵的性能损失做到这一点,并且想知道是否有可能在一个 SQL 语句中实现相同的结果,或者至少找到一种更优化的方法。

SELECT COUNT(`id`) AS `status` FROM `task` WHERE `status` = 'done'
UNION
SELECT COUNT(`id`) AS `status` FROM `task` WHERE `status` = 'pending';

上面的查询结果有 2 行,我可以把它们加起来得到总共 5 个是正确的,第一行是完成任务的计数:从那里很容易得到 3/5 或 60% 完成

status
------
3
2

我知道这个例子很具体,我试过这个查询但遇到了一些问题。关于分组?还是我完全错了?

SELECT
COUNT(CASE WHEN `status` = 'done' THEN 1 ELSE 0 END) AS `done`,
COUNT(CASE WHEN `status` = 'pending' THEN 1 ELSE 0 END) AS `pending`
FROM `task`
GROUP BY `status`;

以上查询结果为2列3重复行:

done    pending
---------------
3       3
1       1
2       2

在这个示例表中,我查看了 5 个有效任务中的 3 个或 60% 已完成。

name        status
------------------
task 1      done
task 2      done
task 3      pending
task 4      done
task 5      invalid
task 6      pending

感谢您的帮助!

【问题讨论】:

【参考方案1】:

您也在使用else 0 计算错误条件。删除它会默认为 null 用于比较 false 并且不会被计算在内。

SELECT
COUNT(CASE WHEN `status` = 'done' THEN 1 END) AS `done`,
COUNT(CASE WHEN `status` = 'pending' THEN 1 END) AS `pending`
FROM `task`
WHERE `status` in ('done','pending')

或者这可以简化为

SELECT
SUM(`status` = 'done') AS `done`,
SUM(`status` = 'pending') AS `pending`
FROM `task`
WHERE `status` in ('done','pending')

【讨论】:

我现在可以看到了,谢谢!

以上是关于同一个 SQL 语句中的多个条件计数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

sql中如何使一列中的多个重复数据只显示第一条

vb中的循环语句

想要在“不喜欢”中添加多个值,其中sql中的条件[重复]

SQL 语句取合计数

具有多个条件的sql where子句c#Web服务[重复]

05_循环语句