2012-06-25 74 views
0

我需要一點幫助讓這個腳本做我想做的。需要一點幫助,SQL Server 2000,擁有和最大(日期)

SELECT KM.initials, 
     TPL.debprice, 
     TMP.pricegroup, 
     TMP.date 
FROM klientmedarbejder KM 
     INNER JOIN timeprismedarbejderprisgruppe TMP 
       ON KM.employeeno = TMP.employeeno 
     INNER JOIN timeprisprisgruppelinie TPL 
       ON TMP.pricegroup = TPL.pricegroup 
GROUP BY KM.initials, 
      TMP.date, 
      TPL.debprice, 
      TMP.pricegroup, 
      TPL.date 
HAVING (Max(TMP.dato) = TPL.date) 

我需要的是最新(最大)日期的debPrice。一名員工經歷了他的職業生涯,偶爾他的價格也會提升。價格從一組價格中選擇。

  1. KlientMedarbejder是員工表。
  2. TimeprisMedarbejderPrisgruppe是他的記錄升級到新價格的日期列表。
  3. TimeprisPrisgruppeLinie是您可以擁有的價格清單。

我有解決方案,每個員工有2個選項。因此:

emp A - 300 - 9 - 1900-01-01 
emp A - 500 - 4 - 2012-01-01 
emp B - 400 - 6 - 1900-01-01 
emp B - 800 - 8 - 2012-04-01 

因此,每當他加入公司時,第一條記錄就是默認值。在2012年,他終於足夠好了,以獲得更好的價格標籤。現在我需要在每個員工的升級列表上找到最新日期的答案。因此,僱員甲應該給我500,僱主乙應該給我800.現在不是所有的僱員可能已經有01-01或04-01價格更新。一些員工隨着時間的推移最多有8次升級,我只關心最新的。

客戶我是從這個拉數據運行的是SQL Server 2000中

回答

5

SQL Server 2000的典型解決方案是將employeeno的和他們的最大日期隔離(這是2005+容易得多)。僞代碼:

SELECT d.columns, etc. FROM 
(
    SELECT employeeno, [date] = MAX([date]) 
    FROM dbo.tablewithdates 
    GROUP BY employeeno 
) AS grouped_emp 
INNER JOIN dbo.tablewithdates AS d 
ON d.employeeno = grouped_emp.employeeno 
AND d.[date] = grouped_emp.[date] 
INNER JOIN ... 

危險的是,如果爲employeeno +日期是不是唯一的,你可以得到多行,所以你需要確定如何處理關係。

我會寫你的模式,但我不能逆向工程你的查詢找出哪個表是哪個。從簡單開始並着手。

+0

您忘記了內聯視圖中的group by子句。 –

+0

感謝@ConradFrix。就像我說的,僞代碼。 :-) –

+0

Thanx,給了我最後一次推動我需要的。非常感激。 – DoStuffZ

0

HAVING子句發生在group by之後,所以它只能使用聚合列。

您需要計算之前的最大日期。這需要在計算中添加子查詢,然後使用WHERE子句進行正確的篩選:

SELECT KM.initials, TPL.debprice, TMP.pricegroup, TMP.date 
FROM klientmedarbejder KM INNER JOIN 
    timeprismedarbejderprisgruppe TMP 
    ON KM.employeeno = TMP.employeeno INNER JOIN 
    timeprisprisgruppelinie TPL 
    ON TMP.pricegroup = TPL.pricegroup join 
    (select employeeno, MAX(dato) as maxdato 
     from timeprismedarbejderprisgruppe t 
     group by employeeno 
    ) tmax 
    on tmax.employeeno = tmp.employeeno 
where tmp.dato = tmax.maxdato 
GROUP BY KM.initials, TMP.date, TPL.debprice, TMP.pricegroup, TPL.date 
+0

爲什麼一個where子句?這不是加入標準的一部分嗎? –

+0

你可以這樣做。如果你確實在問,那是因爲當我看到原始查詢時,我想「哦,HAVING子句真的應該是WHERE子句來做他想做的事情。」 –

+0

好吧,'INNER JOIN'語法與簡單'FROM x,y,z'語法的好處之一是您可以在邏輯上將連接條件與過濾條件分開。所以如果要添加實際的過濾標準,我會發現這種形式的可讀性稍差。因人而異。 –