查询以显示每个卖方的最大销售额

时间:2020-05-23 15:15:06

标签: sql

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

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  |
+---------------+------------+------+

我只希望每位推销员的顶部销售以及何时销售。

因此,每个销售员只应退货一次。

4 个答案:

答案 0 :(得分:2)

具有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)

答案 1 :(得分:1)

您的查询还可以带来结果,但是where子句中的“ =”运算符需要更改为“ IN”,因为下面的查询带来了多于1行,因此它需要在where子句中使用IN运算符。另外,您查询中的数据返回了正确的结果,但是通常请谨慎使用,因为与@forpas给出的示例的销售额(值)相比,它还会带来错误的结果。

enter image description here

更改运算符后,您的查询将可用。

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

您还可以使用rank()窗口函数

 SELECT Name_Seller, Month, VALUE
 FROM (SELECT Name_Seller, Month, VALUE,
       RANK() OVER (PARTITION BY Name_Seller ORDER BY VALUE DESC ) as RN
       FROM SALES
      ) A
 WHERE A.RN = 1

enter image description here

答案 2 :(得分:0)

它看起来像这样:

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

答案 3 :(得分:0)

您可以使用以下查询,

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

如果您也希望使用月份,请使用

select s2.name_seller, s1.month, max(s2.value) from sales s1
inner join 
(select name_seller, max(value) as value from sales
group by name_seller) s2
on (s1.name_seller = s2.name_seller and s1.value = s2.value);