如何获得分组计数mysql的总和

时间:2019-12-18 16:24:59

标签: mysql

我的查询只是返回并进行分组,但是我需要分组的总和。 。代码:

select   a.date, count(*) 
from employee a 
inner join department b on a.uid = b.id 
where date(a.date) between current_date-2 and current_date  
group by 1 having count(*)>1 
order by date

我的输出:

           date       count
    November 18,2019    2
    November 18,2019    4
    November 18,2019    2
    November 19,2019    2
    November 19,2019    2

预期输出:

           date       count
    November 18,2019    8
    November 19,2019    4

1 个答案:

答案 0 :(得分:2)

这里只是一个猜测。没有足够的信息来进行诊断。

MySQL从DATE或DATETIME数据类型返回'November 18,2019'很奇怪。我的猜测是a.date是DATETIME数据类型,并且包含时间分量。

好像我们想将时间分量放到一个DATE值,然后按该值分组。

再次,我只是在猜测问题。

我个人会这样写查询:

 SELECT DATE(a.date)    AS `date_` 
      , COUNT(*)        AS `cnt_`
   FROM employee a
   JOIN department b
     ON b.id = a.uid
  WHERE a.date >=  DATE(NOW()) + INTERVAL -2 DAY
    AND a.date <   DATE(NOW()) + INTERVAL +1 DAY
  GROUP BY DATE(a.date)
 HAVING COUNT(*) > 1
  ORDER BY DATE(a.date)

关注

上一个查询展示了一种典型的模式,当我们想获得按天计算的总数时,当我们有DATETIME列时;在返回DATE值的表达式上执行GROUP BY,而不是在DATETIME列上执行GROUP BY。

上一个查询从头开始就忽略了该查询如何返回一个奇怪的'November 18,2019'显然是VARCHAR值,其中的DATE()会产生除错误或NULL之外的任何东西,以及如何可能满足DATE值之间的条件。

但是将所有这些混乱放在一边,并试图更直接地回答所提出的问题:如何获得计数的总和。

一种方法是采用返回计数的查询,然后将其转换为内联视图。

请注意,这是一种错误的方法,难以获得结果,但通过结合原始查询的确切SQL文本,通过演示更直接地回答了问题:

  SELECT v.date 
       , SUM(v.`count(*)`)
    FROM ( -- inline view
           -- original (wrongish-looking weird-ass) query start here

             select   a.date, count(*) 
             from employee a 
             inner join department b on a.uid = b.id 
             where date(a.date) between current_date-2 and current_date  
             group by 1 having count(*)>1 
             order by date

           -- original query ends here 
         ) v
   GROUP BY v.date
   ORDER BY v.date

上面的查询可能返回问题中显示的“预期结果”。但是我强烈怀疑此查询的返回结果实际上满足原始规范。