2013-06-20 3 views
1

редактировать: PostgreSQLКак получить средние значения NTiles в SQL?

У меня есть куча цифр продаж для некоторых сотрудников ... таблица выглядит примерно так:

SalesRep # of sales/day  NTILE(2) 
    -------- --------------  ---------- 
    Johnny   1     1 
    Johnny   1     1 
    Johnny   4     1 
    Johnny   5     2 
    Johnny   5     2 
    Johnny   5     2 
    Sara    2     1 
    Sara    2     1 
    Sara    2     1 
    Sara    3     2 
    Sara    4     2 
    Sara    5     2 
    ...    ...    ... 

Я хотел бы найти средние # продаж каждого представитель делает за день на их 50% худшие исполнительские дни, а также их 50% из лучших конкурсных дней

Так, например, я хотел бы выходную таблицу выглядеть следующим образом:

SalesRep #ofSales Bottom50% #ofSales Top50% 
    --------  --------------   ---------- 
    Johnny   2     5 
    Sara    2     4 
    ...    ...    ... 

До сих пор у меня есть:

select 
    salesrep, 
    case when ntile = 1 then avg(numsales) end, 
    case when ntile = 2 then avg(numsales) end, 
    ... 
    ... 
    case when ntile = 10 then avg(numsales) end 

    from (

select 
    salesrep, 
    numsales, 
    NTILE(10) over (PARTITION BY salesrep order by numsales asc) as ntile 
from XXX 
    ) as YYY 

group by salesrep, ntile 

Это дает мне странные ошибки, когда выход включает в себя кучу ... значения NULL смотрите таблицу ниже:

SalesRep  #ofSales Bottom50% #ofSales Top50% 
    --------  --------------   ---------- 
    Johnny   NULL     5 
    Sara    2     NULL 
    ...    ...     ... 
+0

MySQL, MS SQL? – Justin

+0

Что такое tile2 или ntile? это ранжирование? или ярлык для процентиля? – Edper

+1

@Justin: не может быть MySQL, потому что он по-прежнему не поддерживает функции окна. и не может быть SQL Server, поскольку он не имеет функции 'ntile()'. Наверное, это Oracle. –

ответ

1

Одна строка в желаемый результат представляет собой a SalesRep - поэтому необходимо добавить команду SalesRepтолько. И case выражения бы затем внутри в avg вызовы как их аргументы, например:

select 
    salesrep, 
    avg(case when ntile = 1 then avg(numsales) end), 
    avg(case when ntile = 2 then avg(numsales) end), 
    ... 
    ... 
    avg(case when ntile = 10 then avg(numsales) end) 

from (
    select 
     salesrep, 
     numsales, 
     NTILE(10) over (PARTITION BY salesrep order by numsales asc) as ntile 
    from XXX 
) as YYY 

group by salesrep, ntile 
;

или переписывание выше, не все, что фантазии форматирования:

select 
    salesrep, 
    avg(case when ntile = 1 then numsales end), 
    avg(case when ntile = 2 then numsales end), 
    ... 
    ... 
    avg(case when ntile = 10 then numsales end) 

from (
    select 
     salesrep, 
     numsales, 
     NTILE(10) over (PARTITION BY salesrep order by numsales asc) as ntile 
    from XXX 
) as YYY 

group by salesrep 
; 
Смежные вопросы