【问题标题】:How to count occurrences of certain column value efficiently in SQL?如何在 SQL 中有效地计算某些列值的出现次数?
【发布时间】:2017-02-15 10:59:49
【问题描述】:

我正在使用 MySQL。

我有一张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_ids,以及另外两个计算download_started数量和download_failed数量的列:

id | service id | download_started | download_failed
----------------------------------------------------------------------
0  | 1001       | 2                | 0
1  | 1002       | 2                | 1
2  | 1003       | 1                | 1

我只关心download_starteddownload_failed 的状态。

非常感谢。

【问题讨论】:

  • 我删除了不兼容的数据库标签。您应该只使用您真正使用的数据库进行标记。
  • 是mysql还是sql server?如果是 sql server 你可以使用 pivot
  • 只是mysql查询。
  • count(col) group by col 将为您提供每个值在查询中出现的次数。
  • 感谢@GordonLinoff 我是新来的。

标签: mysql sql data-modeling


【解决方案1】:

你可以用这个:

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;

【讨论】:

    【解决方案2】:

    在 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;
    

    【讨论】:

      猜你喜欢
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      相关资源
      最近更新 更多