2012-01-20 78 views
2

我給兩個例子,第一個一個工程,第二個與我想做的事:SQL MAX最新與WHERE IN子句

SELECT P.ProjName, D.update_date, SUM(E.pass), SUM(E.fail) 
    FROM execution AS E INNER JOIN ( 
    daily AS D INNER JOIN project AS P ON D.project_ID = P.ID) 
    ON E.daily_ID = D.ID 
    WHERE D.project_id = 25 AND D.update_date = ( 
    SELECT MAX(update_date) FROM daily WHERE project_id = 25;) 
    GROUP BY P.ProjName, D.update_date; 

這將單個項目的工作。它給了我一個特定項目(這裏是25)最近一天的通過和失敗的總數。我想使用WHERE IN子句獲取一組項目。例如(但不起作用):

SELECT P.ProjName, D.update_date, SUM(E.pass), SUM(E.fail) 
    FROM execution AS E INNER JOIN ( 
    daily AS D INNER JOIN project AS P ON D.project_ID = P.ID) 
    ON E.daily_ID = D.ID 
    WHERE D.project_id IN (25,26,28,29,30,31) 
    GROUP BY P.ProjName, D.update_date 
    HAVING MAX(D.update_date); 

這將導致每個日期被拉爲每個項目。有3個表格涉及'項目',它由'每日'鏈接,通過'執行'鏈接。所以,對於每個項目,都有多個日常數據,每天有多個執行數據。我意識到HAVING MAX可能需要比較,但是對於什麼?也許修改後的JOIN會有所幫助。

感謝, 基思

+0

你使用MSSQL嗎? –

+0

這是使用Excel VBA中的ADODB連接器(Jet 4)的MS Access數據庫。第一個答案,解決了它。感謝大家的幫助。 – dropper

+0

另外一個注意事項。我需要將P.ID添加到SELECT和GROUP BY語句中以保持原始順序。 – dropper

回答

7

這是一個有點棘手試圖做到這一點不知道的數據庫,但試試這個:

SELECT P.ProjName, D.update_date, SUM(E.pass), SUM(E.fail) 
    FROM execution AS E INNER JOIN ( 
    daily AS D INNER JOIN project AS P ON D.project_ID = P.ID) 
    ON E.daily_ID = D.ID 
    WHERE D.project_id IN (25,26,28,29,30,31) AND D.update_date = ( 
    SELECT MAX(update_date) FROM daily WHERE project_id = D.project_id) 
    GROUP BY P.ProjName, D.update_date; 

我真的不知道,如果這是接近你想要的任何東西。

+0

這很好。謝謝! – dropper

+0

哇真的嗎?哈哈!太好了,祝你好運:) –

0

沒有指定特定的DBMS,所以這個怎麼樣(未經測試)SQL代碼應該大部分是DBMS無關:

SELECT P.ProjName, 
     DesiredProjectUpdateDate.MaxUpdateDate, 
     SELECT SUM(pass) AS PassSum 
     FROM execution 
     WHERE daily_ID=D.ID, 
     SELECT SUM(fail) AS FailSum 
     FROM execution 
     WHERE daily_ID=D.ID 
FROM 
(-- This derived table helps you get the correct records from the daily table 
    SELECT D.project_ID, MAX(D.Update_date) AS MaxUpdateDate 
    FROM daily AS D 
    GROUP BY D.project_ID 
    WHERE D.project_ID IN (25,26,28,29,30,31) 
) As DesiredProjectUpdateDate 
JOIN daily AS D 
    ON D.project_ID=DesiredProjectUpdateDate.project_ID AND 
    D.Update_date=DesiredProjectUpdateDate.MaxUpdateDate 
JOIN project AS P 
    ON P.ID = DesiredProjectUpdateDate.ProjectId 

給一個如果您還有其他問題,請告訴我。

0

問題是,您需要一個select來爲每個項目返回update_date的最大值。

試試這個:

SELECT P.ProjName, D.update_date, SUM(E.pass), SUM(E.fail) 
    FROM execution AS E INNER JOIN ( 
    daily AS D INNER JOIN project AS P ON D.project_ID = P.ID) 
    ON E.daily_ID = D.ID 
    WHERE D.project_id IN (25,26,28,29,30,31) 
    AND D.update_date > ALL 
    (SELECT update_date FROM 
    daily AS D2 
    WHERE D.ID=D2.ID -- I am assuming that daily.ID is the primary key 
    AND ISNULL(D.update_date, '9999 DEC 31') <> D2.update_date) 
    GROUP BY P.ProjName, D.update_date; 

我經常寫這樣的疑問,他們是比使用MAX聚合函數,並很好地提高工作效率。

編輯:對不起,我忘了刪除你現在多餘的HAVING MAX...行。我的錯!

+0

你試過這個嗎? –

+0

是的,但它給了我一個錯誤:「在查詢表達式中使用函數的參數數量錯誤'D.ID = D2.ID AND ISNULL(D.update_date,'9999 DEC 31')<> D2.update_date'。」也許Jet不喜歡ISNULL?我沒有嘗試過ISNULL,它給了我每一個日期。 – dropper

+0

嗯。我不太瞭解Jet/Access,但我給了你T-SQL代碼...感謝你讓我知道它沒有成功。 –