I have two tables:
Table A:
EmployeeID | DailyHour | Date |
---|---|---|
ID001 | 2 | 2021-02-01 |
ID001 | 4 | 2021-02-03 |
ID001 | 4 | 2021-02-04 |
ID001 | 4 | 2021-02-10 |
ID001 | 8 | 2021-02-15 |
ID002 | 8 | 2021-02-20 |
Table B:
EmployeeID | Week | StandardHours |
---|---|---|
ID001 | 2021-02-05 | 40 |
ID001 | 2021-02-12 | 40 |
ID001 | 2021-02-19 | 40 |
ID002 | 2021-02-12 | 40 |
How can I get the sum of DailyHour, StandardHours
per EmployeeID
(Date
within range of Week
)
Expected Output:
For EmployeeID
= ID001
and Date
Between Feb 1 2021
and Feb 12 2021
EmployeeID | DailyHours | StandardHours |
---|---|---|
ID001 | 14 | 80 |
Thank you in advance.
Advertisement
Answer
You’ll need to aggregate first, and then JOIN
the data, based on the Employee’s ID:
x
WITH Daily AS(
SELECT EmployeeID,
SUM(DailyHour) AS DailyHours
FROM dbo.TableA
WHERE [Date] >= '20200201'
AND [Date] <= '20200212'
GROUP BY EmployeeID),
Standard AS(
SELECT EmployeeID,
SUM(StandardHours) AS StandardHours
FROM dbo.TableB
WHERE [Week] >= '20200201'
AND [Week] <= '20200212'
GROUP BY EmployeeID)
SELECT D.EmployeeID,
D.DailyHours,
S.StandardHours
FROM Daily D
JOIN Standard S ON D.EmployeeID = S.EmployeeID;
If an Employee might not have Standard or Daily hours, you’ll need to use a LEFT JOIN
or FULL OUTER JOIN
, along with ISNULL
(in the SELECT
).