我有一个这样的表(示例):
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 |
+---------------+------------+------+
我只希望每位推销员的顶部销售以及何时销售。
因此,每个销售员只应退货一次。
答案 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给出的示例的销售额(值)相比,它还会带来错误的结果。
更改运算符后,您的查询将可用。
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
答案 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);