SQL Server - лучший продавец в регионе - PullRequest
4 голосов
/ 19 февраля 2010
    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

Ответы [ 6 ]

1 голос
/ 20 февраля 2010

Я сделал что-то вроде предложенного 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

Обратите внимание, что это также работает для связей, так как rank (), похоже, ставит одинаковый рейтинг на равные суммы.

0 голосов
/ 20 февраля 2010

Это не так уж сложно. Этот запрос будет делать именно то, что вы хотите.

 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
0 голосов
/ 19 февраля 2010

Прежде всего, я не понимаю, почему 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
0 голосов
/ 19 февраля 2010

В SQL Server 2005 и выше используйте ROW_NUMBER с PARTITION BY.Следующее должно работать (не проверено, и, вероятно, может быть сокращено):

0 голосов
/ 19 февраля 2010

Используя Sql Server 2005+, вы можете сделать это, используя ROW_NUMBER ()

Посмотрите на этот полный пример.

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
0 голосов
/ 19 февраля 2010

Вы можете использовать агрегат max (). Это, вероятно, менее эффективно, чем другие альтернативы, потому что вы будете делать группу вдвое

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