2011-09-26 107 views
1

我有一個「收入」表,用於存儲公司州組合的收入。需要GROUP BY SQL的幫助

Company int 
State char(2) 
IsBiggestState bit 
TotalRevenue numeric (10,2) 

如果TotalRevenue數量是公司內所有州的最大數量,我需要將IsBiggestState位設置爲1。

你能幫我寫SQL嗎?由於我正在處理數百萬條記錄,因此效率值得關注。

我們在SQL2008 R2上。

+0

您使用的是什麼RDBMS和版本? – Lamak

+1

如果兩個州的某個公司的收入相同,該怎麼辦? – RedFilter

回答

2
UPDATE A 
SET A.IsBiggestState = 1 
FROM YourTable A 
INNER JOIN (SELECT Company, MAX(TotalRevenue) MaxRevenue FROM YourTable 
      GROUP BY Company) B 
ON A.Company = B.Company AND A.TotalRevenue = B.MaxRevenue 
+0

您需要在您的子查詢中使用「GROUP BY」。如果有兩個州的收入相同(最高),這也可能有問題,但我希望他會希望他們都標記您的查詢會執行哪些操作。 – JNK

+0

@JNK哦,是的,我喜歡。更新我的答案,謝謝。是的,我認爲同一個收入最高的不止一個州也是如此。 – Lamak

1

這將解決2個州具有相同TotalRevenue(如果這確實是一個問題)的問題。它只會將其中的一個標記爲IsBiggestState。我不完全確定性能與其他解決方案相比如何。

UPDATE A 
SET A.IsBiggestState = 1 
FROM Revenue A 
INNER JOIN 
(
    SELECT 
     Company 
     ,[State] 
     ,ROW_NUMBER() OVER (PARTITION BY Company ORDER BY TotalRevenue desc) as rownum 
    FROM Revenue 
) B 
ON A.Company = B.Company AND A.[State] = B.[State] AND B.rownum = 1 
+0

您確定可以使用別名「A」來指定目標表嗎?我不認爲別名在這種情況下工作。 – ChadD

+0

它應該很好。 – kevev22