2014-02-25 65 views
0

目標:
我需要檢索最新消息日期(最大),數量及其附件行,和供應商名稱。
此外,我們需要將結果限制爲今年(2014-01-01 00:00:00)之後發送的郵件,郵件中有50k行或更多的附件。轉換MySQL查詢MS SQL Server的...對總需求沒有

嘗試:
看到這個sqlFiddle

SELECT 
    v.name 
    ,a.attachmentRows 
    ,MAX(e.createdDate) recentDate 
FROM emailMessage e 
INNER JOIN vendor v 
    ON (e.vendorID = v.vendorID) 
INNER JOIN emailAttachment a 
    ON (e.emailMessageID = a.emailMessageID) 
WHERE e.createdDate > '2014-01-01 00:00:00.000' 
AND a.attachmentRows >= 50000 
GROUP BY e.vendorID 


期望:

|  NAME | ATTACHMENTROWS |      RECENTDATE | 
|-------------|----------------|---------------------------------| 
| "Company C" |   123880 | February, 22 2014 10:00:00+0000 | 


問題: 雖然我SQL技能是相當原始的,我與MySQL的味道還算舒服,所以我開始了我的fiddling有。該查詢按預期工作。
當切換到SQL Server,不過,我碰到這個錯誤每個選定字段:

,因爲它不是在聚合函數或載列「blahBlah」在選擇列表中無效GROUP BY子句。

我明白錯誤在告訴我什麼,但有三張表參與其中,我不知道如何補救它。 (當然,簡單地通過所有選定字段分組不會產生預期的效果。)

請求:
請幫幫忙!

回答

0

請試試這個Fiddle

SELECT 
    v.name 
    ,a.attachmentRows 
    ,e.createdDate recentDate 
FROM emailMessage e 
INNER JOIN vendor v 
    ON (e.vendorID = v.vendorID) 
INNER JOIN emailAttachment a 
    ON (e.emailMessageID = a.emailMessageID) 
INNER JOIN (SELECT MAX(emailMessageID) emailMessageID, vendorID from emailMessage group by vendorID) as maxi 
    on maxi.emailMessageID = e.emailMessageID 
WHERE e.createdDate > '2014-01-01 00:00:00.000' 
AND a.attachmentRows >= 50000 

這是假設emailMessageID增量與createdDate。如果兩封電子郵件到達完全相同的時間戳,則使用日期會有問題。

+0

啊..我明白你在那裏做了什麼。在@ $$取消關於「emailMessageID」遞增可能是危險的,它適用於這種情況。由於-A-一堆。 – mOrloff

+0

確實,這不是一個完美的解決方案。您可能還希望加入我添加的新INNER JOIN中的emailAttachment表,並將> = 50000謂詞移入其中,以便獲得行數超過50K的max emailMessageID。希望它能幫助你至少指出正確的方向。 – JiggsJedi

+0

完美!準確地說,我需要的手工。謝謝 – mOrloff

0
SELECT 
    v.name 
    ,a.attachmentRows 
    ,MAX(e.createdDate) recentDate 
FROM emailMessage e 
INNER JOIN vendor v 
    ON (e.vendorID = v.vendorID) 
INNER JOIN emailAttachment a 
    ON (e.emailMessageID = a.emailMessageID) 
WHERE e.createdDate > '2014-01-01 00:00:00.000' 
AND a.attachmentRows >= 50000 
GROUP BY v.name ,a.attachmentRows 
+0

這將返回多個記錄,因爲它被分組在attachmentRows上。 – JiggsJedi

+0

通過'v.name'進行分組可以工作,但不幸的是,通過'a.attachmentRows'進行分組將阻止我們獲得該供應商的最新結果。無論如何謝謝你的建議:) – mOrloff