MySQL按值选择计数

Posted

技术标签:

【中文标题】MySQL按值选择计数【英文标题】:MySQL select count by value 【发布时间】:2011-11-14 02:22:12 【问题描述】:

我有这个mysql表:

DATE | VALUE

我希望成为一个选择,它向我显示以下信息:

DATE | COUNT TOTAL | COUNT VAL=1 | COUNT VAL=2

有什么想法可以实现这一点吗?

【问题讨论】:

这听起来像是家庭作业。您应该添加该标签,然后发布您迄今为止尝试过的内容,解释没有按您预期工作的内容,然后我们可以尝试帮助您找出原因。我们不会为你做这项工作,因为那样你不会学到任何东西。 好吧,我可以创建单独的查询(一个用于总体概述,一个用于 VAL1 和 VAL2)。但我无法将它们组合起来:SELECT date, COUNT(*) FROM payment WHERE paymentProviderId = 2 GROUP BY YEAR( DATE ) , MONTH(DATE ) , DAY(DATE ) (不,这不是家庭作业) 我现在有这个确切的问题,在我的情况下,这不是家庭作业。 【参考方案1】:
SELECT date,
       COUNT(*),
       COUNT( IF( value = 1, 1, NULL ) ),
       COUNT( IF( value = 2, 1, NULL ) )
FROM my_table

【讨论】:

有没有更简洁的方法?不包括硬编码的值。【参考方案2】:
SELECT `date`, COUNT(*) AS `COUNT TOTAL`, 
  COUNT(CASE `value` WHEN 1 THEN `value` END) AS `COUNT VAL=1`
  COUNT(CASE `value` WHEN 2 THEN `value` END) AS `COUNT VAL=2`
FROM mytable
GROUP BY `date`

没有匹配项时,CASE 表达式将为空。 COUNT() 不计算空值。

我想您可能想要动态数量的列,数据中找到的每个值对应一列。 这在 SQL 中是不可能的。在您编写查询时必须知道这些列。

因此,您有两种选择来获取每个值的小计:

首先从value 的所有行中查询不同的值,然后动态构造一个 SQL 查询,在选择列表中为要报告的每个不同的值附加一列。然后运行这个 SQL 查询。

或者,将所有行作为行获取。计算应用程序代码中每个值的小计。

另一种选择是按组计算小计,并包括总计:

SELECT `value`, `date, COUNT(*) AS `COUNT SUBTOTAL`
FROM mytable
GROUP BY `value`, `date` WITH ROLLUP

但这不会按照您的要求报告列中的小计,而是按行报告小计。

【讨论】:

【参考方案3】:

我认为使用SUM() 可以获得更简洁的代码。因为它对行的各个表达式的值求和。

SELECT date,
   COUNT(*),
   SUM( value = 1 ),
   SUM( value = 2 )
FROM my_table

官方文档可以在here找到。

【讨论】:

我猜这是更干净的方式

以上是关于MySQL按值选择计数的主要内容,如果未能解决你的问题,请参考以下文章

mysql 选择计数与另一个选择计数

MySQL 自动递增和选择计数

MySQL选择不同的计数

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

Mysql如何以10分钟间隔选择计数聚合结果

MySQL 选择计数与 EXISTS