Оконные функции в SQL Server - PullRequest
       3

Оконные функции в SQL Server

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

У меня есть таблица с именем Orders, в которой данные выглядят так:

EMpID  OrderValue OrderID
1      100        1
2      167        89
....

Есть несколько заказов для каждого empID. Я хочу получить вывод в этой форме

EMPID RANK VALUETOTAL VALUETHISEMPID 
1     1    300        100
4     2    300        50\
.....

Если есть несколько EmpID с одинаковым значением ValueThisEmpID, тогда он должен получить одинаковый ранг.

Я пытался

SELECT EmpID,SUM(val) OVER() as VALUETOTAL,SUM(val) OVER(PARTITION BY EmpID)

Как я могу получить ранг и заказать его по ValueThisEmpID?

1 Ответ

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

Первые тестовые данные:

insert into #t values (1, 10, 100)
insert into #t values (1, 20, 101)
insert into #t values (2, 30, 120)
insert into #t values (3, 10, 130)
insert into #t values (3, 10.5, 131)
insert into #t values (4, 100, 140)

Вам нужно два шага, один для получения empIds и их суммарной стоимости заказа. Шаг второй будет получить общую сумму и звание:

; with Step1 (EmpId, ValueThisEmpId) as
    (select empId, sum(OrderValue)
    from #t
    group by empId)
select EmpId, 
    rank() over(order by ValueThisEmpId desc) as "rank", 
    sum(ValueTHisEmpId) over() as ValueTotal, 
    ValueThisEmpId
from Step1

Это даст вывод:

4   1   180.50  100.00
1   2   180.50  30.00
2   2   180.50  30.00
3   4   180.50  20.50

Если вы не хотите пробелов в рейтинге, используйте плотный ранг:

; with Step1 (EmpId, ValueThisEmpId) as
    (select empId, sum(OrderValue)
    from #t
    group by empId)
select EmpId, 
    dense_rank() over(order by ValueThisEmpId desc) as "rank", 
    sum(ValueTHisEmpId) over() as TotalValue, 
    ValueThisEmpId
from Step1    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...