同一个 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 语句中的多个条件计数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章