2009-08-25 5 views
0
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 

результат, установленные на запуская каждый запрос будет какSQL-запрос, чтобы сравнить результаты следующих запросов

 
09/28/2007 00:00:00 702,457.36 
09/21/2007 00:00:00 703,604.59 
09/07/2007 00:00:00 636,619.92 
09/14/2007 00:00:00 698,082.03 

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

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

+0

Я не могу получить этот вопрос? Можете ли вы быть более конкретным? –

+0

Да, что именно вы подразумеваете под «сравнением»? – colithium

+0

Что означает «сравнить»? Это какая-то разница?Является ли дельта между Total counts? Вы должны указать пример того, что вы хотите. –

ответ

0

, если вы хотите сравнить результаты запроса по сравнению с прошлым годом (то есть за каждый день со дня получения eeding год), можно сгруппировать в день 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 
1

Есть много вещей недосказанное. Надеюсь, вы получите более четкие требования в своей повседневной работе ... В любом случае, вот симуляция вашей ситуации. Он основан на предположении, что дни с данными (по одному в неделю) такие же, в 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. 

Надеется, что это помогает.

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

+0

DAY_AND_MONTH \t SUM2007 года \t SUM2008 \t РАЗЛИЧИЕ PERCENTAGE_DIFFEREN 14-sep \t 698,082.03 \t \t \t 19-сентября \t \t 706,719.21 \t \t 07-сентября \t 636,619.92 \t \t \t 21-сентября \t 703,604.59 \t \t \t 28-сентября \t 702,457.36 \t \t \t 26-сентября \t 731,784.51 \t \t 12- sep \t 711,813.59 Я получил приведенный выше результат, выполнив тот же запрос \t Это связано с следующей причиной: 1. Мы получаем данные в конце недели. Как день недели конца на 08 год за сентябрь месяца являются 05,12,19,26 и 07 является 07,14,21,28 2. Пожалуйста, дайте мне знать, как сравнить данные неделю мудрой – Irveen

+0

Тогда изменения предложение group by и соответствующее выражение в списке выбора использовать маску формата «iw» вместо «dd-mm». –

-1

Почему вы не смотрите на аналитические функции, поставляемые с 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; 
+0

-1 Пожалуйста, проверьте тестирование перед отправкой решения –

+0

У меня нет ваших таблиц. Я тестировал на образце DB, который у меня есть. Почему вы не смотрите на ссылку в своем ответе? Оно работает. – bkm

+0

Я не оригинальный плакат. Я создал таблицу T с вашими данными, а предлагаемый SQL содержит синтаксические ошибки. Когда я исправляю синтаксис, мне интересно, как результаты помогут оригинальному плакату. Если вы говорите, что вы протестировали, то вы проверили что-то еще. –

Смежные вопросы