【问题标题】:MySQL select count by valueMySQL按值选择计数
【发布时间】: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 ) (不,这不是家庭作业)
  • 我现在有这个确切的问题,在我的情况下,这不是家庭作业。

标签: mysql select count


【解决方案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找到。

    【讨论】:

    • 我猜这是更干净的方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2012-03-05
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多