2010-02-02 2 views
0

У меня есть таблица под названием Orders, в котором данные выглядит следующим образом:Windowed функции в SQL Server

 
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?

+0

Я пришел сюда SELECT DISTINCT EmpID, SUM (val) OVER() как VALUETOTAL, SUM (val) OVER (PARTITION by EmpID) как VALUEEMP, 100/SUM (val) OVER() * SUM (val) OVER (PARTITION by EmpID) в качестве ПРОЦЕНТА ОТ ПРОДАЖИ. ORDERVALUE ORDER BY VALUEEMP DESC Единственное, что сейчас отсутствует Рейтинг –

+0

В вашем вопросе не указаны проценты. Пожалуйста, обновите свой вопрос, если у вас есть дополнительные критерии. –

+0

На самом деле я думал о добавлении процента, как процент от общей продажи, был сделан конкретным сотрудником. Это легко после помощи ур. Спасибо –

ответ

0

Сначала некоторые тестовые данные:

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