MySQL - 在一个查询中按两列计数[重复]

Posted

技术标签:

【中文标题】MySQL - 在一个查询中按两列计数[重复]【英文标题】:MySQL - Count by two columns in one query [duplicate] 【发布时间】:2018-04-10 19:01:00 【问题描述】:

这是我的桌子:

| ID | TYPE |
|  1 |  1   |
|  2 |  1   |
|  3 |  1   |
|  4 |  0   |
|  5 |  0   |

现在,我想计算 TYPE=1 存在多少条记录,以及 TYPE=0 存在多少条记录。有可能吗?

我知道,我可以通过两个查询来完成:

SELECT COUNT(*) AS all_zero FROM `table WHERE type = 0;
SELECT COUNT(*) AS all_one FROM `table WHERE type = 1;

但我想在一个查询中完成。 有可能吗?

【问题讨论】:

【参考方案1】:

条件聚合就可以了...

SELECT SUM(t.type=0)          AS cnt_zero
     , SUM(t.type=1)          AS cnt_one
     , SUM(t.type IN (0,1))   AS cnt_one_and_zero
     , SUM(1)                 AS cnt_all
  FROM mytable t
;

请注意,type=0type=1 的用法是 mysql 特定的简写,其他数据库可能不会接受。

如果我们忽略对NULL值的处理,这基本上等价于

SELECT SUM(IF( t.type=0        ,1,0))   AS cnt_zero
     , SUM(IF( t.type=1        ,1,0))   AS cnt_one
     , SUM(IF( t.type IN (0,1), 1,0))   AS cnt_one_and_zero
     , SUM(1)                           AS cnt_all
  FROM mytable t
;

更符合 ANSI 标准的等效项

SELECT SUM(CASE WHEN t.type=0        THEN 1 ELSE 0 END)  AS cnt_zero
     , SUM(CASE WHEN t.type=1        THEN 1 ELSE 0 END)  AS cnt_one
     , SUM(CASE WHEN t.type IN (0,1) THEN 1 ELSE 0 END)  AS cnt_one_and_zero
     , SUM(1)                                            AS cnt_all
  FROM mytable t
;

要获得与此答案中的第一个查询相同的 NULL 值处理和相同的结果,我们可以这样写:

SELECT SUM(CASE WHEN t.type=0        THEN 1 WHEN t.type IS NULL THEN NULL ELSE 0 END)  AS cnt_zero
     , SUM(CASE WHEN t.type=1        THEN 1 WHEN t.type IS NULL THEN NULL ELSE 0 END)  AS cnt_one
     , SUM(CASE WHEN t.type IN (0,1) THEN 1 WHEN t.type IS NULL THEN NULL ELSE 0 END)  AS cnt_one_and_zero
     , SUM(1)                                                                          AS cnt_all
  FROM mytable t
;

在所有这些中,主题保持不变:我们正在汇总条件的结果。又名条件聚合

【讨论】:

【参考方案2】:

GROUP BY 正是这样做的:

SELECT type, COUNT(*) AS count_of_type FROM my_table GROUP BY type

这将为您提供多行,每种类型一个:

+------+---------------+
| type | count_of_type |
+------+---------------+
|    0 |             2 |
|    1 |             3 |
+------+---------------+

如果你有更多类型,但只想要0和1,你可以添加一个HAVING子句:

SELECT type, COUNT(*) AS count_of_type FROM my_table GROUP BY type HAVING type IN (0,1)

如果您希望在单个结果集行中获得不同的计数,请参阅the answer by spencer7593

【讨论】:

【参考方案3】:

很简单:

SELECT
    `type`,
    count(*) as `typecount`
FROM table
GROUP BY `type`

【讨论】:

以上是关于MySQL - 在一个查询中按两列计数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在熊猫中按两列计算唯一记录?

如何在c#中按两列对DataTable进行排序

如何以最佳方式按两列进行 GROUP BY 和计数?

按两列对 MySQL 表排序

按两列查找并删除重复行

按两列对数据框进行排序(有条件)[重复]