我有一个每日报告系统,它显示一个特定的电信员在一天内的电话数量。而且效果很好。
我想把它再分成几个小时,例如9-10,10-11等等。
当前mysql代码如下。请原谅我的代码不完善,我是一个自学的,已经从Stackexchange学到了我的东西。
SELECT
comments.hrname,
IF((HOUR(comments.date))= '9', COUNT(comments.Outcome),'') AS `9-10`,
IF((HOUR(comments.date)) = '10', COUNT(comments.Outcome),'') AS `10-11`,
IF((HOUR(comments.date)) = '11', COUNT(comments.Outcome),'') AS `11-12`,
IF((HOUR(comments.date)) = '12', COUNT(comments.Outcome),'') AS `12-13`,
IF((HOUR(comments.date)) = '13', COUNT(comments.Outcome),'') AS `13-14`,
IF((HOUR(comments.date)) = '14', COUNT(comments.Outcome),'') AS `14-15`,
IF((HOUR(comments.date)) = '15', COUNT(comments.Outcome),'') AS `15-16`,
IF((HOUR(comments.date)) = '16', COUNT(comments.Outcome),'') AS `16-17`,
IF((HOUR(comments.date)) = '17', COUNT(comments.Outcome),'') AS `17-18`,
IF((HOUR(comments.date)) = '18', COUNT(comments.Outcome),'') AS `18-19`,
IF((HOUR(comments.date)) = '19', COUNT(comments.Outcome),'') AS `19-20`,
IF((HOUR(comments.date)) = '20', COUNT(comments.Outcome),'') AS `20-21`,
IF((HOUR(comments.date)) = '21', COUNT(comments.Outcome),'') AS `21-22`
FROM
comments
WHERE
DATE(comments.date) = DATE(NOW()) AND
MONTH(comments.date) = MONTH(NOW()) AND
YEAR(comments.date) = YEAR(NOW())
GROUP BY
comments.hrname
我得到的结果是:
我哪里出问题了?
这是一个供大约10个用户使用的内部软件,主要是为了消除共享excel的使用,所以SQL注入等并不是真正关心的AFAIK。
任何帮助都将不胜感激。
发布于 2016-06-02 14:56:01
您的查询所做的是将COUNT()
放在您想要的列中,但它实际上计算了每一行。只有一个条件,COUNT()
将“计数”和“不计数”区分开来。也就是说,无论什么情况,当您计算COUNT(*)
的每一行时。当您使用COUNT(column_name)
时,它只计算不是NULL
的行。不过,那就算了。
你真正想做的是:
SUM(IF((HOUR(comments.date)) = '9', 1, 0)) AS `9-10`,
另一注:
当你做的时候
WHERE
DATE(comments.date) = DATE(NOW()) AND
MONTH(comments.date) = MONTH(NOW()) AND
YEAR(comments.date) = YEAR(NOW())
没有必要对月份和年份进行比较,因为这已经在DATE()
中讨论过了。
一个更好的方法就是这样做:
WHERE comments.date BETWEEN CURDATE() AND CONCAT(CURDATE(), ' 23:59:59')
或
WHERE comments.date >= CURDATE()
AND comments.date < CURDATE() + INTERVAL 1 DAY
这是因为当您在列上使用函数时,MySQL不能在列上使用索引(如果有索引的话)。
https://dba.stackexchange.com/questions/140234
复制相似问题