mysql 计数器 计算不重复

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 计数器 计算不重复相关的知识,希望对你有一定的参考价值。

参考技术A 计数不重复方法如下:
分组是必须的,在分组的情况下对符合条件的CLASS进行整个的不重复计数。
或者能先把CLASS这一列去掉,能在查询中再插一列做为新列也行要么不加WorkSubstance分组,只COUNT,要么不去count(DistinctClass),直接COUNTselectcount(DistinctClass)asClassfromClassDatewhereMachine=\'020-C03\'andDateTime=\'2014-7-18\'。

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

【中文标题】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 计数器 计算不重复的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 抛出“java.sql.SQLException:列计数与第 1 行的值计数不匹配”[重复]

获取用逗号分隔的值的计数[重复]

仅当重复电子邮件或电话时,Mysql 计数总数

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

MySQL - 为每个重复值获取一个计数器

mysql选择当前位置的计数器[重复]