如何有效地计算SQL中某些列值的出现次数?
How to count occurrences of certain column value efficiently in SQL?
我正在使用 MySQL。
我有 table 个 service_status
:
id | service_id | service_status
----------------------------------------------------------------------
0 | 1001 | download_started
1 | 1001 | download_started
2 | 1002 | download_started
3 | 1002 | download_started
4 | 1002 | download_failed
5 | 1003 | download_started
6 | 1003 | download_failed
7 | 1003 | something_else
8 | 1003 | another_thing
我想查询所有 service_id
和另外两个计算 download_started
数量和 download_failed
数量的列:
id | service id | download_started | download_failed
----------------------------------------------------------------------
0 | 1001 | 2 | 0
1 | 1002 | 2 | 1
2 | 1003 | 1 | 1
我只关心 download_started
或 download_failed
的状态。
非常感谢。
你可以使用这个:
SELECT
service_id,
SUM(CASE WHEN service_status = 'download_started' THEN 1 ELSE 0 END) download_started,
SUM(CASE WHEN service_status = 'download_failed' THEN 1 ELSE 0 END) download_failed
FROM
table_name
GROUP BY
service_id
ORDER BY
service_id;
在MySQL中,可以将表达式简化为:
SELECT service_id,
SUM(service_status = 'download_started') as download_started,
SUM(service_status = 'download_failed') as download_failed
FROM t
GROUP BY service_id;
我正在使用 MySQL。
我有 table 个 service_status
:
id | service_id | service_status
----------------------------------------------------------------------
0 | 1001 | download_started
1 | 1001 | download_started
2 | 1002 | download_started
3 | 1002 | download_started
4 | 1002 | download_failed
5 | 1003 | download_started
6 | 1003 | download_failed
7 | 1003 | something_else
8 | 1003 | another_thing
我想查询所有 service_id
和另外两个计算 download_started
数量和 download_failed
数量的列:
id | service id | download_started | download_failed
----------------------------------------------------------------------
0 | 1001 | 2 | 0
1 | 1002 | 2 | 1
2 | 1003 | 1 | 1
我只关心 download_started
或 download_failed
的状态。
非常感谢。
你可以使用这个:
SELECT
service_id,
SUM(CASE WHEN service_status = 'download_started' THEN 1 ELSE 0 END) download_started,
SUM(CASE WHEN service_status = 'download_failed' THEN 1 ELSE 0 END) download_failed
FROM
table_name
GROUP BY
service_id
ORDER BY
service_id;
在MySQL中,可以将表达式简化为:
SELECT service_id,
SUM(service_status = 'download_started') as download_started,
SUM(service_status = 'download_failed') as download_failed
FROM t
GROUP BY service_id;