2014-08-27 5 views
0

я естьНаивысший и MTD в том же запросе

create table 
    tbl(CustKey int, dt varchar(6), category varchar(20), amtbc int) 
    insert into tbl values(2475,'201402','P',100) 
    insert into tbl values(2475,'201403','P',130) 
    insert into tbl values(2475,'201311','R',2056) 
    insert into tbl values(2475,'201312','R',978) 
    insert into tbl values(2475,'201406','P',100) 
    insert into #tbl values(2475,'201406','R',410) 
    insert into tbl values(2475,'201401','P',200)  
    insert into #tbl values(2475,'201407','R',179) 
    insert into tbl values(2475,'201404','P',100) 
    insert into #tbl values(2475,'201405','P',380) 
    insert into tbl values(2475,'201407','P',100) 
    insert into #tbl values(2475,'201401','R',1377) 
    insert into tbl values(9628,'201404','P',500) 
    insert into #tbl values(9628,'201405','P',500) 
    insert into tbl values(9628,'201402','P',500) 
    insert into #tbl values(9628,'201406','P',500) 
    insert into tbl values(9628,'201401','P',500) 
    insert into #tbl values(9628,'201407','P',500) 
    insert into tbl values(9628,'201403','P',500) 

выберите * от ТПС:

CustKey dt category amtbc 
2475 201402 P  100 
2475 201403 P  130 
2475 201311 R  2056 
2475 201312 R  978 
2475 201406 P  100 
2475 201406 R  410 
2475 201401 P  200 
2475 201407 R  179 
2475 201404 P  100 
2475 201405 P  380 
2475 201407 P  100 
2475 201401 R  1377 
9628 201404 P  500 
9628 201405 P  500 
9628 201402 P  500 
9628 201406 P  500 
9628 201401 P  500 
9628 201407 P  500 
9628 201403 P  500 

Тогда у меня есть этот выбор, которые считают SUM amtbc за custkey. в категории, за Dt (ежемесячном)

выберите custkey, дт, сумма (случай, когда категория в ('R'), а затем amtbc еще 0 конец) как ostatnisuma,

сумма (случай когда категория в ('P'), то amtbc еще 0 конец), как residencesuma из TBL группы по custkey, дт порядка по custKey, дт
, который дает мне это:

custkey dt ostatnisuma residencesuma 
2475 201311 2056   0 
2475 201312 978   0 
2475 201401 1377  200 
2475 201402 0   100 
2475 201403 0   130 
2475 201404 0   100 
2475 201405 0   380 
2475 201406 410   100 
2475 201407 179   100 
9628 201401 0   500 
9628 201402 0   500 
9628 201403 0   500 
9628 201404 0   500 
9628 201405 0   500 
9628 201406 0   500 
9628 201407 0   500 

так что теперь я знаю, суммы для каждогомесяц. Но id хотел бы знать сумму категории P за каждый месяц (ее нормально), но для категории R я хочу знать сумму в течение всего года и вводить эту сумму за весь год в каждую строку за этот год. так что финальный стол будет выглядеть следующим образом:

custkey dt ostatnisuma residencesuma 
2475 201311 2056  0 
2475 201312 978  0 
2475 201401 1377 1110 
2475 201402 0  1110 
2475 201403 0  1110 
2475 201404 0  1110 
2475 201405 0  1110 
2475 201406 410  1110 
2475 201407 179  1110 
9628 201401 0  3500 
9628 201402 0  3500 
9628 201403 0  3500 
9628 201404 0  3500 
9628 201405 0  3500 
9628 201406 0  3500 
9628 201407 0  3500 

Обратите внимание, что в действительности количество категорий, как 100+ и около 500 000 значений ... Большое спасибо заранее для вас помощь

+0

я попытался overpartition, но он принял навсегда ...:/тогда я пытался что-то вроде «случае, когда категория = 'P' и LEFT (дт, 4) = влево (дт, 4), то SUM (AmtBC) else 0 end as residencesumapokus ", но он не работал – Nightmaresux

+0

, затем я попробовал" (выберите SUM (amtbc) из #tbl, где category = 'P' и LEFT (dt, 4) = left (dt, 4)) в качестве resumsumapokus ", но это дает мне SUM всех «P», независимо от года:/ – Nightmaresux

+0

, затем я попытался »(выберите isnull (SUM (amtbc), 0) из #tbl a где category = 'P' и LEFT (a.dt, 4) = left (payments.dt, 4)) как resencesumapokus ", но он будет дублировать строки :( – Nightmaresux

ответ

1

вас хотите пункт OVER:

SUM(...) OVER (PARTITION BY custkey, dt/100) 
+0

Привет, как я сказал раньше, в мае se over partition невозможно из-за огромного количества значений (100 + категорий и т. д.), поэтому запрос будет навсегда ...:/спасибо за ответ :) – Nightmaresux

+0

Вам просто нужен правильный индекс. Создайте вычисленный столбец на dt/100 (возможно, назовите его dt100) и index (custkey, dt100). Если вы включили все остальные столбцы, которые нужно вернуть, это должно быть очень быстрым. Вероятно, вы заметите, что в плане запроса (без индекса) есть дорогая сортировка. Этот Сортировка должен исчезнуть с правильным индексом. –

0

Вы можете попробовать left join на запросе, который группирует по ключу клиента и год.

declare @tbl table (CustKey int, dt varchar(6), category varchar(20), amtbc int); 
insert into @tbl values(2475,'201402','P',100) 
insert into @tbl values(2475,'201403','P',130) 
insert into @tbl values(2475,'201311','R',2056) 
insert into @tbl values(2475,'201312','R',978) 
insert into @tbl values(2475,'201406','P',100) 
insert into @tbl values(2475,'201406','R',410) 
insert into @tbl values(2475,'201401','P',200)  
insert into @tbl values(2475,'201407','R',179) 
insert into @tbl values(2475,'201404','P',100) 
insert into @tbl values(2475,'201405','P',380) 
insert into @tbl values(2475,'201407','P',100) 
insert into @tbl values(2475,'201401','R',1377) 
insert into @tbl values(9628,'201404','P',500) 
insert into @tbl values(9628,'201405','P',500) 
insert into @tbl values(9628,'201402','P',500) 
insert into @tbl values(9628,'201406','P',500) 
insert into @tbl values(9628,'201401','P',500) 
insert into @tbl values(9628,'201407','P',500) 
insert into @tbl values(9628,'201403','P',500) 

--select * from @tbl 

select 
    t.CustKey, 
    t.dt, 
    sum (case when t.category in ('R') then t.amtbc else 0 end) as ostatnisuma, 
    --sum (case when t.category in ('P') then t.amtbc else 0 end) as residencesuma, 
    coalesce(avg(x.residencesuma),0) as residencesuma 
from @tbl t 

-- sub-query totals custkey, year 
left join(
    select 
     custkey, 
     left(dt,4) as year, 
     sum (case when category in ('P') then amtbc else 0 end) as residencesuma 
    from @tbl 
    where category in ('P') 
    group by custkey, left(dt,4) 
) x on x.CustKey = t.CustKey and x.year = left(t.dt,4) 

group by t.CustKey, t.dt 
order by t.CustKey, t.dt 
Смежные вопросы