2009-01-28 67 views
1

SQL Server查詢我的總結是:SQL與差異

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 

我該怎麼做?

+0

請編輯數據,使得15變爲03/01和7變爲4/22。現在令人困惑。 – Quassnoi 2009-01-28 18:43:41

+0

數據需要包括邊界條件:如果3/1的數量是15並且4/22的數量是12,我應該有7而不是10的結果? – jcollum 2009-01-28 21:42:20

回答

0

爲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 
+0

我認爲OP實際上是在尋找min rc.creditAmount和max rc.creditAmount之間的區別。 – 2009-01-28 18:21:59

+0

是的,我同意。這幾乎肯定是OP的一個錯字。 – Cerebrus 2009-01-28 18:24:32

1

在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

這裏是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

這是你在找什麼,我相信....

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