Reputation: 8460
The SQL Server query I have is:
SELECT
ep.employeeID, ep.punchdate, rc.creditAmount
FROM
EmployeePunch ep
INNER JOIN
ResponderCredit rc ON rc.employeeID = ep.employeeID AND
rc.punchdate = rc.creditdate
ORDER BY ep.employeeID
and get a result set:
EmployeeID Date CreditAmount
----------- ------- --------------
5 01/01/2007 5
5 03/01/2007 7
5 04/22/2007 15
6 01/01/2007 3
6 01/12/2007 4
And I want to group by EmployeeID and Credit amount. The catch is that I need the change in the Credit Amount between the max and min date so:
EmployeeID CreditAmount
----------- --------------
5 10
6 1
How can I do this?
Upvotes: 1
Views: 238
Reputation: 5834
Here is a solution for MSSQL.
It will show a negative value if the credit has gone down over the time period.
It's got a few inner joins and can probably be optimized, but probably not by much
SELECT maxCredit.employeeID, maxCredit.creditAmount - minCredit.creditAmount FROM ( SELECT ep.employeeID, rc.creditAmount FROM EmployeePunch ep INNER JOIN ResponderCredit rc ON rc.employeeID = ep.employeeID AND rc.punchdate = rc.creditdate INNER JOIN ( SELECT ep2.employeeID, MAX(ep2.punchdate) AS maxCreditdate FROM EmployeePunch ep2 GROUP BY ep2.employeeID ) innermax ON innermax.employeeID = ep.employeeID AND ep.punchdate = innermax.maxcreditDate ) maxCredit INNER JOIN ( SELECT ep.employeeID, rc.creditAmount FROM EmployeePunch ep INNER JOIN ResponderCredit rc ON rc.employeeID = ep.employeeID AND rc.punchdate = rc.creditdate INNER JOIN ( SELECT ep3.employeeID, MIN(ep3.punchdate) AS minCreditdate FROM EmployeePunch ep3 GROUP BY ep3.employeeID ) innermin ON innermin.employeeID = ep.employeeID AND ep.punchdate = innermin.mincreditDate ) minCredit ON maxCredit.employeeID = minCredit.employeeID
Upvotes: 0
Reputation: 3226
This is what you're looking for I believe....
SELECT
ep.employeeID, Max(datediff(day, ep.punchdate, rc.creditDate)) As [# of Days], rc.creditAmount
FROM
EmployeePunch ep
INNER JOIN
ResponderCredit rc
ON
rc.employeeID = ep.employeeID AND rc.punchdate = rc.creditdate
group by ep.employeeID, rc.creditAmount
ORDER BY ep.employeeID
Will yield results:
EmployeeID # of Days CreditAmount
5 0 5
5 2 7
5 111 15
6 0 3
6 334 4
Upvotes: 0
Reputation: 425673
In Oracle:
SELECT r1.employeeID, amMax - amMin
FROM (
SELECT employeeID, amMin
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY ep.EmployeeID ORDER BY rc.creditdate) AS rnMin,
ep.employeeID, rc.creditAmount AS amMin
FROM
EmployeePunch ep, ResponderCredit rc
WHERE
rc.employeeID = ep.employeeID
AND rc.punchdate = rc.creditdate
)
WHERE rn_min = 1
) r1,
(
SELECT employeeID, amMin
FROM (
SELECT
ROW_NUMBER() OVER (PARTITION BY ep.EmployeeID ORDER BY rc.creditdate DESC) AS rnMax,
ep.employeeID, rc.creditAmount AS amMax
FROM
EmployeePunch ep, ResponderCredit rc
WHERE
rc.employeeID = ep.employeeID
AND rc.punchdate = rc.creditdate
)
WHERE rn_max = 1
) r2
WHERE r1.employeeID = r2.employeeID
Upvotes: 1
Reputation: 2110
for MS SQL, this should do it
SELECT
ep.employeeID, rc.creditAmount,
datediff(month, max(ep.punchdate), min(ep.punchdate))
FROM
EmployeePunch ep
INNER JOIN
ResponderCredit rc ON rc.employeeID = ep.employeeID AND
rc.punchdate = rc.creditdate
group by
EmployeeID, Credit
ORDER BY
ep.employeeID
Upvotes: 0