根据另一列的总和选择列

6

假设我有

SalesManagerId, SaleAmount, ProductId

我想对每个 (SalesManagerId, ProductId) 的 SaleAmount 进行求和,并获取具有最大 sum(SaleAmount)ProductId

这是否可以在一个查询中实现?

示例:

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

好的,在我的帖子中来回讨论后,我终于明白你在问什么了。你说你想“对每个(SalesManagerId、ProductId)求和SaleAmount,并获取具有最大SaleAmount总和的ProductId”——现在请在该从句开头添加“对于每个SalesManagerId”。不清楚你是否只想要每个经理恰好一行。 - Ben Lee
4个回答

4
如果您可以使用分析函数,可以使用 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

+1比我想出来的更好。一个注意点:你的内部SELECT缺少FROM部分。 - Joe Stefanelli
谢谢Joe。我已经添加了FROM占位符。 - Axn

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

这种方法相比于这个解决方案有哪些优势:https://dev59.com/uFHTa4cB1Zd3GeqPTav2#4109768 - Monogonator
Axn的解决方案比我在这里想出来的要优越,因为它可以在表格上一次性完成任务。 - Joe Stefanelli

0

使用 GROUP BY 和 ORDER:

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

这个不行,它会返回相同“SalesManagerId”的多行数据。我只想要销售总额最大的那一行。 - Monogonator
在T-SQL中,“LIMIT 1”是无效的。(我应该事先指定T-SQL。) - Monogonator
@Monogonator:在 TSQL 中,它是 SELECT TOP 1 ... - BlueRaja - Danny Pflughoeft
@Ben Lee:不是的,请看这个例子。SalesManagerId 不是无关的。另一种思考方式是:对于每个 SalesManagerId,返回具有最大总销售额的 ProductId - Monogonator
@BlueRaja - Danny Pflughoeft:这将返回确切的一行,但很明显在结果集中应该有多行。 - Monogonator
显示剩余2条评论

-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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接