繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM