我正在查询小时条目数据库,并按公司和按周汇总。我知道MySQL的周功能是基于一个日历周。话虽这么说,我得到了一些意想不到的分组结果。也许你眼尖的人可以伸出援助之手:
SELECT * FROM (
SELECT
tms.date,
SUM( IF( tms.skf_group = "HP Group", tms.hours, 0000.00 )) as HPHours,
SUM( IF( tms.skf_group = "SKF Canada", tms.hours, 000.00 )) as SKFHours
FROM time_management_system tms
WHERE date >= "2012-01-01"
AND date <= "2012-05-11"
AND tms.skf_group IN ( "HP Group", "SKF Canada" )
GROUP BY WEEK( tms.date, 7 )
# ORDER BY tms.date DESC
# LIMIT 7
) AS T1
ORDER BY date ASC
我的结果如下:(例如,偶尔我们在星期日没有条目。空值是否重要?)
('date'=>'2012-01-01','HPHours'=>'0.00','SKFHours'=>'2.50'),
('date'=>'2012-01-02','HPHours'=>'97.00','SKFHours'=>'78.75'),
('date'=>'2012-01-09','HPHours'=>'86.50','SKFHours'=>'100.00'),
('date'=>'2012-01-16','HPHours'=>'68.00','SKFHours'=>'96.25'),
('date'=>'2012-01-24','HPHours'=>'39.00','SKFHours'=>'99.50'),
('date'=>'2012-02-05','HPHours'=>'3.00','SKFHours'=>'93.00'),
('date'=>'2012-02-06','HPHours'=>'12.00','SKFHours'=>'122.50'),
('date'=>'2012-02-13','HPHours'=>'64.75','SKFHours'=>'117.50'),
('date'=>'2012-02-21','HPHours'=>'64.50','SKFHours'=>'93.00'),
('date'=>'2012-03-02','HPHours'=>'45.50','SKFHours'=>'143.25'),
('date'=>'2012-03-05','HPHours'=>'62.00','SKFHours'=>'136.75'),
('date'=>'2012-03-12','HPHours'=>'54.25','SKFHours'=>'133.00'),
('date'=>'2012-03-19','HPHours'=>'77.75','SKFHours'=>'130.75'),
('date'=>'2012-03-26','HPHours'=>'61.00','SKFHours'=>'147.00'),
('date'=>'2012-04-02','HPHours'=>'86.75','SKFHours'=>'96.75'),
('date'=>'2012-04-09','HPHours'=>'84.25','SKFHours'=>'120.50'),
('date'=>'2012-04-16','HPHours'=>'90.00','SKFHours'=>'127.25'),
('date'=>'2012-04-23','HPHours'=>'103.25','SKFHours'=>'89.50'),
('date'=>'2012-05-02','HPHours'=>'72.50','SKFHours'=>'143.75'),
('date'=>'2012-05-07','HPHours'=>'68.25','SKFHours'=>'119.00')
1月2日是第一个星期一,因此1月1日只有一天。我希望输出是连续的星期一(1月2日,9日,16日,23日,30日等)?在整个结果中,下面意外的一周分组继续。有任何想法吗?
非常感谢!
答案 0 :(得分:3)
当您通过 tms.date
上的某个功能进行分组时,选择tms.date
甚至意味着什么并不清楚。我的猜测是,它意味着“来自与该组对应的任何源行的date
值”。那时,输出完全合理。
鉴于任何给定的群组中都有七个日期,您想要的日期是什么日期?
编辑:"GROUP BY and HAVING with Hidden Columns"实际记录了此行为:
MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列。
...
服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。此外,添加ORDER BY子句不会影响每个组中值的选择。选择值后会对结果集进行排序,而ORDER BY不会影响服务器选择的值。
tms.date
列不是 GROUP BY子句的一部分 - 只有在 tms.date
上运行的函数才是GROUP BY的一部分条款,因此我认为上述文字适用于您选择tms.date
的方式:您在内获得任何日期。
如果您想要最早的日期,可以尝试
SELECT MIN(tms.date), ...
当然,假设MIN
与日期/时间字段一起使用。我不能轻易从文档中说出来。
答案 1 :(得分:0)
问题对我来说并不清楚,但我想你不想按周分组。因为周给一年中的一周。今天是第19周。
我想你想像工作日那样分组,比如GROUP BY WEEKday(tms.date)