Суммирование SQL с разницей - PullRequest
1 голос
/ 28 января 2009

Запрос SQL Server, который у меня есть:

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

и получите набор результатов:

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

И я хочу сгруппировать по идентификатору сотрудника и сумме кредита. Суть в том, что мне нужно изменить сумму кредита между максимальной и минимальной датой так:

EmployeeID          CreditAmount
-----------         --------------
  5                          10
  6                          1

Как я могу это сделать?

Ответы [ 4 ]

1 голос
/ 28 января 2009

В 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
0 голосов
/ 28 января 2009

Я думаю, это то, что вы ищете ...

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

даст результаты:

EmployeeID    # of Days    CreditAmount    
5                 0             5    
5                 2             7    
5                 111           15    
6                 0             3    
6                 334           4
0 голосов
/ 28 января 2009

Вот решение для MSSQL.

Показывает отрицательное значение, если кредит сократился в течение периода времени.

У него есть несколько внутренних соединений, и, вероятно, его можно оптимизировать, но, вероятно, ненамного

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
0 голосов
/ 28 января 2009

для MS SQL, это должно сделать

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...