SQL Serverの - トップセールスマンパーリージョン
-
21-09-2019 - |
質問
SELECT region, person, sum(dollars) as thousands
FROM sales
GROUP BY region, person
ORDER BY region, sum(dollars) desc
上記のSQLは次のように地域ごとの営業担当者の完全なリストを生成します。
region person thousands
canada mike smith $114
canada joe blog $76
canada pete dodd $45
usa john doe $253
usa jane smyth $120
europe pieter tsu $546
europ mike lee $520
私は(下記のとおり)地域ごとのトップセールスマンを示すに興味があるならば、私はそれを行う最良の方法は?
region person thousands
canada mike smith $114
usa john doe $253
europe pieter tsu $546
解決
は私が提案しburnallような何かをやりました。ランキング= 1ここで、私は私が全部サブクエリを作ったので、一部「タイでトップ1」で多くの愛を取得し、行を選択していませんでした。
select *
from
(
select region,
person,
rank() over(partition by region order by sum(dollars) desc) as ranking
from sales
group by region,
person
) temp
where ranking = 1
これはまた、(ランク以来の絆のために働くことに注意)は等しい合計でランキングを同じを置くようです。
他のヒント
あなたは ROW_NUMBER()を使用してこれを行うことができます2005+ SQL Serverを使用
この完全な例を見てください。
DECLARE @sales TABLE(
region VARCHAR(50),
person VARCHAR(50),
Sales FLOAT
)
INSERT INTO @sales SELECT 'canada','mike smith',1
INSERT INTO @sales SELECT 'canada','mike smith',1
INSERT INTO @sales SELECT 'canada','mike smith',1
INSERT INTO @sales SELECT 'canada','mike smith',1
INSERT INTO @sales SELECT 'canada','joe blog',1
INSERT INTO @sales SELECT 'canada','joe blog',1
INSERT INTO @sales SELECT 'canada','pete dodd',1
INSERT INTO @sales SELECT 'usa','john doe',1
INSERT INTO @sales SELECT 'usa','john doe',1
INSERT INTO @sales SELECT 'usa','jane smyth',1
INSERT INTO @sales SELECT 'europe','pieter tsu',1
INSERT INTO @sales SELECT 'europe','pieter tsu',1
INSERT INTO @sales SELECT 'europe','mike lee',1
;WITH Counts AS(
SELECT region,
person,
count(*) as thousands
FROM @sales
GROUP BY region,
person
), CountVals AS(
SELECT *,
ROW_NUMBER() OVER(PARTITION BY region ORDER BY thousands DESC) ROWID
FROM Counts
)
SELECT *
FROM CountVals
WHERE ROWID = 1
はSQL Server 2005およびROW_NUMBER
で上記の使用PARTITION BY
。以下の(テスト、そしておそらく短縮することができない)動作するはずです。
WITH total_sales
AS (SELECT region, person, count(*) as thousands
FROM sales
GROUP BY region, person
ORDER BY region, count(*) desc
)
, ranked_sales
AS (SELECT region, person, thousands,
ROW_NUMBER() OVER (PARTITION BY region ORDER BY thousands DESC, person) AS region_rank
FROM total_sales
)
SELECT region, person, thousands
FROM ranked_sales
WHERE region_rank = 1
COUNT(*)は$である理由を私は理解していないまず第一に。 私のソリューションは、既存のに似ていますが、短いと私はより速く
と考えていますselect top 1 with ties region, person, rank() over(partition by region order by count(*) desc)
from sales
group by region, person
order by 3
これはあまりにも難しいことではありません。このクエリは、正確に何をしたい行います。
select distinct region,
(select top 1 person
from Sales s2 where s2.region = s1.region
group by person
order by SUM(dollars) desc) as person,
(select top 1 SUM(dollars)
from Sales s2 where s2.region = s1.region
group by person
order by SUM(dollars) desc) as thousands
from sales s1
あなたは最大()集計を使用することができます。あなたが二回
でグループをやってますので、それはおそらく、他の選択肢よりも効率ですSELECT region,person,max(thousands) FROM
(SELECT region, person, count(*) as thousands
FROM sales
GROUP BY region, person) tmp
GROUP BY region, person
ORDER BY region, max(thousands) desc
各地域の販売により、トップ5の販売員を見つけるために、
select *
from
(
select region,
[Customer Name],
rank() over(partition by region order by sum(sales) desc) as ranking
from Orders
group by region, [Customer Name]
) temp
where ranking between 1 and 5
所属していません StackOverflow