同一条SQL语句中的多个条件计数

时间:2018-08-20 19:42:17

标签: mysql sql

目标是考虑到每个任务的状态,在任务列表上取得进度,排除无效任务。

目前,我设法在性能上付出了非常昂贵的代价,并且想知道是否有可能在一个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 个答案:

答案 0 :(得分: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')