[英]Get personal and total worked hours in the same query
我有下表(简化):
user_id date hours
1 2012-03-01 5
2 2012-03-01 8
3 2012-03-01 6
1 2012-03-02 3
3 2012-03-02 7
我想要的是获得给定用户ID(例如1)的总工作时间,以及在单个查询中无论哪个用户(给定时间段)的总工作时间。
因此,对于user_id = 1 ,时间段: 2012-03-01-2012-03-02 ,查询应返回: own = 8,total = 29 。
我可以在两个单独的查询中执行此操作,但不能在单个查询中执行。
使用CASE
:
SELECT SUM(
CASE user_id
WHEN 1 THEN hours
ELSE 0
END) as Own,
SUM(hours) as Total
FROM HoursWorked
WHERE date BETWEEN '2012-03-01' AND '2012-03-02';
我认为我可以使用以下模式进行操作:
CREATE TABLE hoursWorked
(
id int,
date date,
hours int
);
INSERT INTO hoursWorked
(id, date, hours)
VALUES
('1','2012-03-01','5'),
('2','2012-03-01','8'),
('3','2012-03-01','6'),
('1','2012-03-02','3'),
('3','2012-03-02','7');
而这个查询:
select parent.id, parent.date, parent.hours, (select sum(hours)
from hoursWorked child
where child.id = parent.id) as totalHours
from hoursWorked parent
我能够得到以下结果:
ID DATE HOURS TOTALHOURS
1 March, 01 2012 00:00:00-0800 5 8
2 March, 01 2012 00:00:00-0800 8 8
3 March, 01 2012 00:00:00-0800 6 13
1 March, 02 2012 00:00:00-0800 3 8
3 March, 02 2012 00:00:00-0800 7 13
迭戈的答案虽然是程序性的,但却是获得所需答案的好方法。 当然,对于您的日期范围,您需要在“开始日期”和“结束日期”之间添加一个WHERE日期。 日期必须采用mysql可以识别的格式,通常为'yyyy-mm-dd'
另一种解决方案不是将结果单行显示,而是将结果集中在一个UNION中
SELECT user_id, SUM(hours) as hours FROM table WHERE date BETWEEN 'startdate' AND 'enddate' WHERE user_id = 3
UNION
SELECT null as user_id, SUM(hours) as hours FROM table WHERE date BETWEEN 'startdate' AND 'enddate'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.