SQL-запрос для сравнения результатов следующих запросов - PullRequest
0 голосов
/ 25 августа 2009
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

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

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

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

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

Ответы [ 3 ]

1 голос
/ 25 августа 2009

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

Почему вы не смотрите на аналитические функции, предоставляемые Oracle? Я предполагаю, что вы используете Oracle, поскольку вы пометили свой вопрос тегом Oracle. Вы можете обратиться к http://www.oracle -base.com / article / 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 голосов
/ 25 августа 2009

Если вы хотите сравнить результаты запроса в годовом исчислении (т. Е. Для каждого дня со днем ​​предыдущего года), вы можете сгруппировать по дню года

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...