我有这个mysql表:
DATE | VALUE
我希望成为一个选择,向我显示以下信息:
DATE | COUNT TOTAL | COUNT VAL=1 | COUNT VAL=2
我是如何实现这一目标的?
谢谢!
答案 0 :(得分:16)
SELECT date,
COUNT(*),
COUNT( IF( value = 1, 1, NULL ) ),
COUNT( IF( value = 2, 1, NULL ) )
FROM my_table
答案 1 :(得分:2)
我认为使用SUM()
可以获得更整洁的代码。因为它将行的各个表达式的值相加。
SELECT date,
COUNT(*),
SUM( value = 1 ),
SUM( value = 2 )
FROM my_table
可以找到官方文档here。
答案 2 :(得分:0)
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表达式将为null。空值不计入COUNT()
。
我想你可能想要一个动态数量的列,为数据中找到的每个值一列。 这在SQL中是不可能的。在编写查询时必须知道列。
因此,您有两种方法可以获得每个值的小计:
首先查询value
的所有行中的不同值并动态构造SQL查询,在选择列表中为要报告的每个不同值附加一列。然后运行此SQL查询。
或者,将所有行作为行获取。计算应用程序代码中每个值的小计。
另一个替代方法是按组计算小计,并包括总计:
SELECT `value`, `date, COUNT(*) AS `COUNT SUBTOTAL`
FROM mytable
GROUP BY `value`, `date` WITH ROLLUP
但是,这不会按照您的要求报告列中的小计,它会按行报告小计。