Добрый день. Подскажите как оптимальнее сделать следующий запрос.
Допустим есть таблица следующего формата:
Data | Account | In | Dt | Kt | Out | 2015-02-01 | 40817810231321231 | 100 | 10 | 90 | 180 | 2015-02-01 | 40702810356472523 | 200 | 20 | 100 | 280 | 2015-02-28 | 40817810231321589 | 300 | 30 | 110 | 380 | 2015-02-28 | 40702810354581351 | 400 | 40 | 120 | 480 | 2015-03-01 | 40817810231321231 | 500 | 50 | 130 | 580 | 2015-03-01 | 40702810356472523 | 600 | 60 | 140 | 680 | 2015-03-31 | 40817810231321589 | 700 | 70 | 150 | 780 | 2015-03-31 | 40702810354581351 | 800 | 80 | 160 | 880 |
|
По этой таблице нужно сделать группировку по месяцам и по 5 первым символам account чтобы в итоге получилось что-то типа:
Data | Acc2 | In | Dt | Kt | Out | 2015-02 | 40817 | 400 | 40 | 200 | 560 | 2015-02 | 40702 | 600 | 60 | 220 | 760 | 2015-03 | 40817 | 1200 | 120 | 280 | 1360 | 2015-03 | 40702 | 1400 | 140 | 300 | 1560 |
|
Так вот я делаю это тремя запросами, каждый из которых заново пробегает по все таблице:
select * into #in_tmp from (select left([DATA], 7) ‘month’, left(ACCOUNT, 5) acc2, SUM(in) ‘in’ from src_tbl where data like '%-%-01' group by left(ACCOUNT, 5), left([DATA], 7)) tbl;
select * into #dt_kt_tmp from (select left([data], 7) ‘month’, left(ACCOUNT, 5) acc2, sum(dt) ‘dt’, sum(kt) ‘kt’ from src_tbl where group by left(data, 7), left(ACCOUNT, 5)) tbl;
select * into #out_tmp from (select left([DATA], 7) ‘month’, left(ACCOUNT, 5) acc2, SUM(out) [out] from src_tbl where data = EOMONTH(data) group by left(ACCOUNT, 5), left([DATA], 7)) tbl;
А потом джойню их в одну. Но мне кажется это мягко говоря не оптимально 3 раза пробегаться по одной таблице. Можно ли как-нибудь написать такой запрос, чтобы сервер пробегал по таблице только один раз и собирал сразу все три этих значения: in, dt_kt и out?