SQL-запрос для сравнения результатов следующих запросов

SELECT pd_end_dt,SUM(nrx_cnt) Total_Count FROM wkly_lnd.lnd_wkly_plan_rx_summary WHERE pd_end_dt >= '01-Sep-08' AND pd_end_dt < '30-Sep-08' GROUP BY pd_end_dt SELECT pd_end_dt,SUM(nrx_cnt) Total_Count FROM wkly_lnd.lnd_wkly_plan_rx_summary WHERE pd_end_dt >= '01-Sep-07' AND pd_end_dt < '30-Sep-07' GROUP BY pd_end_dt 

набор результатов при запуске каждого запроса будет подобен

 28.09.2007 00:00:00 702 457,36
 21.09.2007 00:00:00 703 604,59
 09/07/2007 00:00:00 636 619,92
 14.09.2007 00:00:00 698 082,03

аналогично за предыдущий год

Мне нужно рассчитать разницу проданных единиц по сравнению с прошлым годом, а также добавить один столбец, который найдет процентное изменение

Есть много недосказанных вещей. Надеюсь, вы получите более четкие требования в своей повседневной работе … Во всяком случае, это симуляция вашей ситуации. Это основано на предположении, что дни с данными (один раз в неделю) совпадают в 2007 году, как и в 2008 году:

 SQL> create table lnd_wkly_plan_rx_summary (pd_end_dt,nrx_cnt) 2 as 3 select date '2008-09-07', 100000 from dual union all 4 select date '2008-09-07', 536619.92 from dual union all 5 select date '2008-09-14', 698082.03 from dual union all 6 select date '2008-09-21', 403604.59 from dual union all 7 select date '2008-09-21', 200000 from dual union all 8 select date '2008-09-21', 100000 from dual union all 9 select date '2008-09-28', 702457.36 from dual union all 10 select date '2007-09-07', 400000 from dual union all 11 select date '2007-09-14', 450000 from dual union all 12 select date '2007-09-21', 500000 from dual union all 13 select date '2007-09-28', 550000 from dual union all 14 select date '2007-09-28', 100000 from dual 15 / Tabel is aangemaakt. 

И ваши оригинальные запросы, слегка измененные.

 SQL> SELECT pd_end_dt 2 , SUM(nrx_cnt) Total_Count 3 FROM lnd_wkly_plan_rx_summary 4 WHERE pd_end_dt >= date '2008-09-01' 5 AND pd_end_dt < date '2008-09-30' 6 GROUP BY pd_end_dt 7 / PD_END_DT TOTAL_COUNT ------------------- ----------- 07-09-2008 00:00:00 636619,92 14-09-2008 00:00:00 698082,03 21-09-2008 00:00:00 703604,59 28-09-2008 00:00:00 702457,36 4 rijen zijn geselecteerd. SQL> SELECT pd_end_dt 2 , SUM(nrx_cnt) Total_Count 3 FROM lnd_wkly_plan_rx_summary 4 WHERE pd_end_dt >= date '2007-09-01' 5 AND pd_end_dt < date '2007-09-30' 6 GROUP BY pd_end_dt 7 / PD_END_DT TOTAL_COUNT ------------------- ----------- 07-09-2007 00:00:00 400000 14-09-2007 00:00:00 450000 21-09-2007 00:00:00 500000 28-09-2007 00:00:00 650000 4 rijen zijn geselecteerd. 

И запрос, с которым вы можете сравнить данные за 2007 и 2008 годы:

 SQL> select to_char(pd_end_dt,'dd-mm') day_and_month 2 , sum(case trunc(pd_end_dt,'yyyy') when date '2007-01-01' then nrx_cnt end) sum2007 3 , sum(case trunc(pd_end_dt,'yyyy') when date '2008-01-01' then nrx_cnt end) sum2008 4 , sum(case trunc(pd_end_dt,'yyyy') when date '2008-01-01' then nrx_cnt end) 5 - sum(case trunc(pd_end_dt,'yyyy') when date '2007-01-01' then nrx_cnt end) difference 6 , ( sum(case trunc(pd_end_dt,'yyyy') when date '2008-01-01' then nrx_cnt end) 7 - sum(case trunc(pd_end_dt,'yyyy') when date '2007-01-01' then nrx_cnt end) 8 ) / sum(case trunc(pd_end_dt,'yyyy') when date '2008-01-01' then nrx_cnt end) * 100 percentage_difference 9 from lnd_wkly_plan_rx_summary 10 where ( ( pd_end_dt >= date '2007-09-01' 11 and pd_end_dt < date '2007-09-30' 12 ) 13 or ( pd_end_dt >= date '2008-09-07' 14 and pd_end_dt < date '2008-09-30' 15 ) 16 ) 17 group by to_char(pd_end_dt,'dd-mm') 18 / DAY_A SUM2007 SUM2008 DIFFERENCE PERCENTAGE_DIFFERENCE ----- ---------- ---------- ---------- --------------------- 07-09 400000 636619,92 236619,92 37,1681615 14-09 450000 698082,03 248082,03 35,5376617 21-09 500000 703604,59 203604,59 28,9373595 28-09 650000 702457,36 52457,36 7,46769313 4 rijen zijn geselecteerd. 

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

 SQL> select day_and_month 2 , sum2007 3 , sum2008 4 , sum2008-sum2007 difference 5 , 100*(sum2008-sum2007)/sum2008 percentage_difference 6 from ( select to_char(pd_end_dt,'dd-mm') day_and_month 7 , sum(case trunc(pd_end_dt,'yyyy') when date '2007-01-01' then nrx_cnt end) sum2007 8 , sum(case trunc(pd_end_dt,'yyyy') when date '2008-01-01' then nrx_cnt end) sum2008 9 from lnd_wkly_plan_rx_summary 10 where ( pd_end_dt >= date '2007-09-01' 11 and pd_end_dt < date '2007-09-30' 12 ) 13 or ( pd_end_dt >= date '2008-09-07' 14 and pd_end_dt < date '2008-09-30' 15 ) 16 group by to_char(pd_end_dt,'dd-mm') 17 ) 18 / DAY_A SUM2007 SUM2008 DIFFERENCE PERCENTAGE_DIFFERENCE ----- ---------- ---------- ---------- --------------------- 07-09 400000 636619,92 236619,92 37,1681615 14-09 450000 698082,03 248082,03 35,5376617 21-09 500000 703604,59 203604,59 28,9373595 28-09 650000 702457,36 52457,36 7,46769313 4 rijen zijn geselecteerd. 

Надеюсь это поможет.

С уважением, Роб.

если вы хотите сравнить результаты запроса в годовом исчислении (т. е. за каждый день с днем ​​предшествующего года), вы можете группировать к дню года to_char('dd-mon') :

 SQL> WITH lnd_wkly_plan_rx_summary AS ( 2 SELECT DATE '2007-09-28' pd_end_dt, 702457.36 nrx_cnt FROM dual 3 UNION ALL SELECT DATE '2007-09-21', 703604.59 FROM dual 4 -- 5 UNION ALL SELECT DATE '2008-09-28' pd_end_dt, 702557.36 nrx_cnt FROM dual 6 UNION ALL SELECT DATE '2008-09-21', 703404.59 FROM dual 7 ) 8 SELECT to_char(pd_end_dt, 'dd-mon') pd_end_dt, 9 SUM(CASE 10 WHEN to_char(pd_end_dt, 'yyyy') = '2007' THEN 11 nrx_cnt 12 END) Total_2007, 13 SUM(CASE 14 WHEN to_char(pd_end_dt, 'yyyy') = '2008' THEN 15 nrx_cnt 16 END) Total_2008, 17 SUM(CASE 18 WHEN to_char(pd_end_dt, 'yyyy') = '2008' THEN 19 nrx_cnt 20 ELSE 21 -nrx_cnt 22 END) delta 23 FROM lnd_wkly_plan_rx_summary 24 WHERE ((pd_end_dt >= DATE '2007-09-01' AND pd_end_dt < DATE '2007-09-30') OR 25 (pd_end_dt >= DATE '2008-09-01' AND pd_end_dt < DATE '2008-09-30')) 26 GROUP BY to_char(pd_end_dt, 'dd-mon'); PD_END_DT TOTAL_2007 TOTAL_2008 DELTA ------------ ---------- ---------- ---------- 28-sep 702457,36 702557,36 100 21-sep 703604,59 703404,59 -200 

Почему вы не смотрите на аналитические функции, предоставляемые Oracle? Я предполагаю, что вы используете Oracle, поскольку вы отметили свой вопрос тегом Oracle. Вы можете обратиться к http://www.oracle-base.com/articles/misc/LagLeadAnalyticFunctions.php .

Я упрощаю ваш набор данных, чтобы выглядеть так

 09/08/2007 100 09/08/2008 200 09/09/2007 350 09/09/2008 400 09/10/2007 150 09/10/2008 175 

Это ваш общий счет на 8,9 и 10 сентября в 2007 и 2008 годах

Вы можете использовать следующий запрос:

Предполагая, что таблица будет T(end_date,cnt) (ваши имена слишком длинны! Извините)

 Select end_date, cnt, LAG(cnt,1,0) over (order by to_number(to_char(end_dt,'dd')),to_number(to_char(end_dt,'mm'))) cntPrev, cnt - LAG(cnt,1,0) over (order by to_number(to_char(end_dt,'dd')),to_number(to_char(end_dt,'mm'))) cntDiff from T 

В более простых выражениях (это не будет работать, если вы скопируете, вставьте).

 Let X=LAG(cnt,1,0) over (order by to_number(to_char(end_dt,'dd')),to_number(to_char(end_dt,'mm'))) 

Ваш запрос

 Select end_date, cnt, X cntPrev, cnt-X cntDiff from T;