2015-03-31 75 views
1

我想我在如何高效地使用GROUP BY消除冗餘記錄方面缺少一些基本知識。我不斷地碰到看起來需要使用COALESCE的地方,除非我最好能告訴它不適用於GROUP BY。在SQL服務器中使用COALESCE(或類似的東西)和GROUP BY

例如:我有與visitID和visitBillingCode的每個組合表的表,以及其他有用的信息一起:

VisitID SearchRank1 SearchRank2 BillingID 
-------------------------------------------------- 
1   34    NULL   3432 
1   34    NULL   3467 
2   27    8    3280 
2   29    NULL   2903 

我想,這樣我每VisitID只有一排倒塌下來。方便的是,我甚至會很樂意拿剛每當有在遊戲中多行的其他列的最大的非空值,讓我結束了這樣的事情:

VisitID SearchRank1 SearchRank2 BillingID 
-------------------------------------------------- 
1   34    NULL   3467 
2   29    8    3280 

看起來這應該與像這樣得到:

SELECT VisitID, 
     COALESCE(SearchRank1) AS SearchRank1, 
     COALESCE(SearchRank2) AS SearchRank2, 
     MAX(BillingID) AS BillingID 
FROM Db.Table1 
GROUP BY VisitID 

但是當我嘗試它,我得到的聚結線錯誤,我想這只是因爲我不能實際使用與集團合併。它是否正確?如果是這樣,那麼做一個有效的方法是什麼?

回答

3

只需使用max()min()

SELECT VisitID, 
     MAX(SearchRank1) AS SearchRank1, 
     MAX(SearchRank2) AS SearchRank2, 
     MAX(BillingID) AS BillingID 
FROM Db.Table1 
GROUP BY VisitID; 

COALESCE()不是聚合函數。但是,聚合函數通常忽略NULL值,所以它們具有相似的效果。

你會使用COALESCE()類似:

select VisitId, coalesce(SearchRank2, SearchRank1) 
from db.table1; 
+1

啊。我現在明白了爲什麼我被其他人弄糊塗了 - 我總覺得我應該避免這種解決方案,因爲如果只有NULL值,MAX/MIN會做一些奇怪的事情,但我現在看到我那是我錯了。謝謝! – neuropsych 2015-03-31 04:05:04

相關問題