在同一查询中获取个人和总工作时间

时间:2012-03-30 17:30:25

标签: mysql

我有下表(简化):

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,总= 29

我可以在两个单独的查询中完成,但不能在一个查询中完成。

3 个答案:

答案 0 :(得分:5)

使用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';

答案 1 :(得分:1)

我认为我有一些使用以下架构的方法:

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

答案 2 :(得分:0)

迭戈的答案尽管程序是一个很好的方式来获得你正在寻找的答案。当然,对于您的日期范围,您需要添加一个WHERE日期BETWEEN'startdate'和'enddate'。日期需要采用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'