我的查询只是返回并进行分组,但是我需要分组的总和。 。代码:
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
答案 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
上面的查询可能返回问题中显示的“预期结果”。但是我强烈怀疑此查询的返回结果不实际上满足原始规范。