2010-11-05 64 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