2011-08-02 95 views
0

我確信這些零件周圍有一些SQL專家。SQL - 從最新選擇*除非= null然後最新非null

Ref Book Amount Run_time Comment 
--- ------ ------ -------- ------- 
22 Book22 45  09:30 NULL 
23 Book23 34  09:30 Comment 
24 Book24 67  09:30 NULL 
25 Book25 57  09:30 NULL 
26 Book26 543 09:30 NULL 
23 Book23 34  10:00 NULL 
22 Book22 45  10:00 OK 
24 Book24 67  10:00 NULL 
25 Book25 57  10:00 NULL 

結果:

23 Book23 34  10:00 Comment 
22 Book22 45  10:00 OK 
24 Book24 67  10:00 NULL 
25 Book25 57  10:00 NULL 

我有一個表作爲附接。我想選擇Ref,Book,金額& Run_time只能從最近運行(10:00)開始,但我也想要最新的可用評論(如果有的話)。所以10:00的運行可能沒有評論,但同樣的參考文獻,書籍等將有一個評論從以前的運行。這也必須能夠應對多個以前的評論(即上午6點&上午7點和上午10點運行有評論,但我只想從最新的評論中發表評論,也必須能夠處理當前或任何評論以前運行在這種情況下,剛剛返回NULL。

希望這是有道理的。

我得到的第一部分(選擇使用最多從最新運行的所有領域,但無法整合最新的評論。

任何幫助,非常感謝。

+1

爲什麼你不使用兩個單獨的表?一個參考,書和金額;另一個用ref run_time和comment。 –

+1

請張貼您的第一個內容。 –

+0

好的,我看到兩個表如何工作...... –

回答

1

推導出一個列表Ref s及其關聯的MAX(Run_Time) & MAX(Run_Time) for non-NULL Comment來自原始表的值。下一步,將原始表到該列表兩次:一次獲得RefBookAmountRun_Time,並且第二次拿到Comment

SELECT 
    r.Ref, 
    r.Book, 
    r.Amount, 
    r.Run_Time, 
    c.Comment 
FROM (
    SELECT 
    Ref, 
    MAX(Run_Time) AS Run_Time, 
    MAX(CASE WHEN Comment IS NOT NULL THEN Run_Time END) AS Comment_Time 
    FROM tblTrades 
) m 
    INNER JOIN tblTrades r ON r.Ref = m.Ref AND r.Run_Time = m.Run_Time 
    LEFT JOIN tblTrades c ON c.Ref = m.Ref AND c.Run_Time = m.Comment_Time 
+0

我相信那是一個 - 謝謝!我會做一些谷歌搜索,因爲我不太明白它,但再次感謝.. –

1

它可以爲你工作的另一種方法是,在添加子查詢選擇列表:

SELECT 
    REF, 
    Book, 
    Amount, 
    Run_Time, 
    (SELECT MAX(Comment) FROM tblTrades WHERE REF = t.Ref) as Comment 
FROM tblTrades t 
    WHERE Run_time=(SELECT MAX(Run_time) FROM tblTrades WHERE REF = t.Ref)