2010-11-05 75 views
6

比方說,我有基於另一列的總和選擇列

SalesManagerId, SaleAmount, ProductId 

我想總結SaleAmount每個(SalesManagerIdProductId)並獲取ProductId與最大sum(SaleAmount)

這是可能的一個查詢?

例子:

1, 100, 1 
1, 200, 1 
1, 600, 1 
1, 400, 2 
2, 100, 3 
3, 100, 4 
3, 100, 4 
2, 500, 6 
3, 100, 5 

結果:

1, 900, 1 
2, 500, 6 
3, 200, 4 
+0

好了,回來後,和 - 在我的帖子中,我終於明白你在問什麼。您說過要「爲每個銷售總額(SalesManagerId,ProductId)總結SaleAmount並以最大總和(SaleAmount)獲取ProductId」 - 現在請將「每個SalesManagerId」添加到該子句的開頭。目前尚不清楚你是否每個經理都只需要一行*。 – 2010-11-05 20:29:35

回答

3

如果您有可用的分析功能,您可以使用RANK()

喜歡的東西:

SELECT SalesManagerId, ProductId, Total 
FROM (
    SELECT SalesManagerId, 
     ProductId, 
     SUM(SaleAmount) as Total, 
     RANK() OVER(PARTITION BY SalesManagerId 
        ORDER BY SUM(SaleAmount) DESC) as R 
    FROM <Table name> 
    GROUP BY SalesManagerId, ProductId) as InnerQuery 
WHERE InnerQuery.R = 1 
+0

哇。這是熱的! – Monogonator 2010-11-05 20:34:37

+0

+1比我做的更好。一個注意:你錯過了你的內部SELECT的FROM部分。 – 2010-11-05 20:53:48

+0

謝謝喬。我已經添加了FROM佔位符。 – Axn 2010-11-06 00:52:13

-2

非常好的問題!

試試這個:

SELECT MAX(SUM(SaleAmount)), ProductId GROUP BY SalesManagerId, ProductId; 

或可替代

SELECT SUM(SaleAmount) as Sum, ProductId GROUP BY SalesManagerId, ProductId ORDER BY Sum DESC; 

你不能剛落之列,得到的只是產品ID

0

使用GROUP BY和ORDER:

SELECT SalesManagerId, SUM(SaleAmount) AS SaleSum, ProductId FROM [table-name] GROUP BY SalesManagerId, ProductId ORDER BY SaleSum DESC 
+0

這不起作用;它會爲同一個'SalesManagerId'返回多行。我只想要最大的'SaleSum'。 – Monogonator 2010-11-05 20:15:38

+0

對不起,我justed做了一個編輯,在查詢的末尾添加「LIMIT 1」來返回最上面一行。 – 2010-11-05 20:16:55

+0

'LIMIT 1'在T-SQL中無效。 (我應該提前指定T-SQL。) – Monogonator 2010-11-05 20:19:41

2

假設至少是SQL 2005,所以你可以使用一個CTE

;with cteTotalSales as (
    select SalesManagerId, ProductId, SUM(SaleAmount) as TotalSales 
     from YourSalesTable 
     group by SalesManagerId, ProductId 
), 
cteMaxSales as (
    select SalesManagerId, MAX(TotalSales) as MaxSale 
     from cteTotalSales 
     group by SalesManagerId 
) 
select ts.SalesManagerId, ms.MaxSale, ts.ProductId 
    from cteMaxSales ms 
     inner join cteTotalSales ts 
      on ms.SalesManagerId = ts.SalesManagerId 
       and ms.MaxSale = ts.TotalSales 
    order by ts.SalesManagerId 
+0

這裏比解決方案有什麼優點:http:// stackoverflow。com/questions/4109622/select-column-based-on-sum-of-another-column/4109768#4109768 – Monogonator 2010-11-05 20:50:38

+0

Axn的解決方案優於我在這裏製作的,因爲它可以完成任務,表。 – 2010-11-05 20:53:31

+0

仍然有幫助,因爲我學到了新的東西!謝謝! – Monogonator 2010-11-06 03:17:12