简体   繁体   中英

Get personal and total worked hours in the same query

I have the following table (simplified):

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

What I want is to get the the sum of hours worked for a given user id (ex. 1), and the total hours worked regardless of what user (for a given time period) in a single query.

So for user_id = 1 , and time period: 2012-03-01 - 2012-03-02 the query should return: own=8, total=29 .

I can do it in two separate queries, but not in a single one.

Use 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';

I think I have something that works using the following schema:

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');

And this query:

select parent.id, parent.date, parent.hours, (select sum(hours)
                         from hoursWorked child
                         where child.id = parent.id) as totalHours
from hoursWorked parent

I was able to get these results:

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

Diego's answer albeit procedural is a great way to get the answer you are looking for. Of course for your date range you would need to add a WHERE date BETWEEN 'startdate' AND 'enddate'. The dates need to be in a format that mysql recognizes, typically 'yyyy-mm-dd'

Another solution that doesn't get you the results in one row, but in a result set would be to do a 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'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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