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按值选择计数的主要内容,如果未能解决你的问题,请参考以下文章