首页 > 解决方案 > 查询以显示每个卖家的最大销售额

问题描述

我有一张这样的表(示例):

Name_Seller   Month   Value
---------------------------
Seller A      Jan     200
Seller B      Jan     100
Seller A      Fev     300
Seller B      Fev     100
Seller C      Jan     400
Seller A      Mar     200
Seller D      Jan     300

SQL查询:

SELECT Name_Seller, Month, Value 
FROM SALES
WHERE Value = (SELECT MAX(Value) FROM SALES GROUP BY Name_Seller);

我想为每个卖家打印他的最大销售量以及销售时间。

你能帮我解决我的查询并解释为什么它不起作用吗?

我试过:

select name_seller, month, max(value) 
from sales 
group by name_seller, month;

但此查询返回:

+---------------+------------+------+
| NAME_SELLER   | MAX(VALUE) | MONTH|
+---------------+------------+------+
| SELLER A      |    4182.00 | Jan  |
| SELLER A      |    3261.00 | Fev  |
| SELLER A      |    4219.00 | Mar  |
| SELLER B      |    2123.00 | Jan  |
| SELLER B      |    2111.00 | Fev  |
| SELLER B      |    3918.00 | Mar  |
| SELLER C      |    3000.00 | Jan  |
| SELLER C      |    4000.00 | Fev  |
| SELLER C      |    1500.00 | Mar  |
| SELLER D      |    2819.00 | Jan  |
| SELLER D      |    3881.00 | Fev  |
| SELLER D      |    2012.00 | Mar  |
+---------------+------------+------+

我想要每个推销员的最高销售额以及什么时候。

所以它应该只为每个销售员返回一份销售。

标签: sql

解决方案


ROW_NUMBER()窗口功能:

SELECT t.Name_Seller, t.Month, t.Value
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY Name_Seller ORDER BY Value DESC) rn
  FROM SALES
) t
WHERE t.rn = 1

如果您想退回领带,请更改ROW_NUMBER()为。RANK()

或者在WHERE子句中使用相关子查询:

SELECT s.* FROM SALES s
WHERE s.Value = (SELECT MAX(VALUE) FROM SALES WHERE Name_Seller = s.Name_Seller)

或者,如果您的数据库支持它:

SELECT * FROM SALES
WHERE (Name_Seller, Value) IN (SELECT Name_Seller, MAX(VALUE) FROM SALES GROUP BY Name_Seller)

推荐阅读