Получите процент увеличения / уменьшения из двух результатов на основе предложения WHERE - PullRequest
0 голосов
/ 15 марта 2020

Я не знаю, понятен ли мой заголовок, но я действительно пытаюсь добиться, чтобы получить процентное увеличение / уменьшение результата 2 от результата 1.

У меня есть таблица SALES с этими образцами данных. :

DATE.         AMOUNT
01-JAN-20.    500
02-JAN-20.    400
...
15-MAR-20.    1000

Предположим, что таблица заполнена ежедневными продажами.

Теперь, с помощью приложения Dashboard, которое я пытаюсь сделать в APEX, я хочу отобразить базу TOTAL AMOUNT из ДАТА, которую пользователь выберет в списке ВЫБОР (сегодня, на этой неделе, в этом месяце). Таким образом, в основном, это были бы запросы:

SELECT SUM(AMOUNT) TOTAL_SALES FROM TB_SALES WHERE DATE = TRUNC(SYSDATE); - Today

SELECT SUM(AMOUNT) TOTAL_SALES FROM TB_SALES WHERE DATE BETWEEN TRUNC(SYSDATE-7,'SUNDAY') AND TRUNC(SYSDATE); - This Week

SELECT SUM(AMOUNT) TOTAL_SALES FROM TB_SALES WHERE DATE BETWEEN TRUNC(SYSDATE, 'MM' AND TRUNC(SYSDATE); - This Month

Чтобы получить процент увеличения или уменьшения, мне теперь нужно получить результат тех же запросов, но с другой датой из предложения WHERE.

Итак, со вчерашнего дня я должен запросить TRUNC(SYSDATE -1); И так далее. На самом деле, я до сих пор не знаю, как получить часть этой недели.

С двумя результатами теперь я могу вычислить процент.

Что я не могу понять, так это как я могу запросите это два предложения WHERE из двух DATE. Мое текущее временное решение - запросить второй запрос и просто использовать JavaScript для обновления моей карты.

Я нашел кое-что о функциях LAG, но не могу найти ни одного примера, в котором для сравнения результатов используется предложение WHERE.

РЕДАКТИРОВАТЬ: Чтобы быть более понятным, это то, что я хочу сравнить и получить процент.

Today VS Yesterday
This week VS Last week
This month VS Last month

1 Ответ

0 голосов
/ 15 марта 2020

Вы можете использовать условное агрегирование, чтобы найти итоги:

SELECT SUM(
         CASE
         WHEN "DATE" >= TRUNC( SYSDATE )
         AND  "DATE" <=  SYSDATE
         THEN AMOUNT
         ELSE NULL
         END
       ) AS total_today,
       SUM(
         CASE
         WHEN "DATE" >= TRUNC( SYSDATE ) - INTERVAL '1' DAY
         AND  "DATE" <  TRUNC( SYSDATE )
         THEN AMOUNT
         ELSE NULL
         END
       ) AS total_yesterday,
       SUM(
         CASE
         WHEN "DATE" >= NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '7' DAY, 'SUNDAY' )
         AND  "DATE" <= SYSDATE
         THEN AMOUNT
         ELSE NULL
         END
       ) AS total_this_week,
       SUM(
         CASE
         WHEN "DATE" >= NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '14' DAY, 'SUNDAY' )
         AND  "DATE" <  NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '7' DAY, 'SUNDAY' )
         THEN AMOUNT
         ELSE NULL
         END
       ) AS total_last_week,
       SUM(
         CASE
         WHEN "DATE" >= TRUNC( SYSDATE, 'IW' ),
         AND  "DATE" <= SYSDATE
         THEN AMOUNT
         ELSE NULL
         END
       ) AS total_this_iso_week,
       SUM(
         CASE
         WHEN "DATE" >= TRUNC( SYSDATE, 'IW' ) - INTERVAL '7' DAY,
         AND  "DATE" <  TRUNC( SYSDATE, 'IW' )
         THEN AMOUNT
         ELSE NULL
         END
       ) AS total_last_iso_week,
       SUM(
         CASE
         WHEN "DATE" >= TRUNC( SYSDATE ) - INTERVAL '6' DAY,
         AND  "DATE" <= SYSDATE
         THEN AMOUNT
         ELSE NULL
         END
       ) AS total_this_7_days,
       SUM(
         CASE
         WHEN "DATE" >= TRUNC( SYSDATE ) - INTERVAL '13' DAY,
         AND  "DATE" <  TRUNC( SYSDATE ) - INTERVAL '6' DAY
         THEN AMOUNT
         ELSE NULL
         END
       ) AS total_last_7_days,
       SUM(
         CASE
         WHEN "DATE" >= TRUNC( SYSDATE, 'MM' )
         AND  "DATE" <= SYSDATE
         THEN AMOUNT
         ELSE NULL
         END
       ) AS total_this_month
       SUM(
         CASE
         WHEN "DATE" >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
         AND  "DATE" <  TRUNC( SYSDATE, 'MM' )
         THEN AMOUNT
         ELSE NULL
         END
       ) AS total_this_month
FROM   tb_sales
WHERE  "DATE" >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
AND   "DATE"  <= SYSDATE;

Здесь будут найдены итоги за:

  • Сегодня и вчера;
  • На этой неделе и на прошлой неделе (с полуночи воскресенья до полуночи следующего воскресенья или до этого момента, в зависимости от того, что наступит раньше);
  • Эта неделя ISO 8601 и последняя неделя ISO 8601 (начиная с полуночи понедельника);
  • Последние 7 дней (сегодня и предыдущие 6 дней) и 7 дней до этого; и
  • Этот месяц и последний месяц (с полуночи первого дня месяца до этого момента).

Если вы хотите, чтобы процентное увеличение увеличилось по сравнению с предыдущим периодом, то:

SELECT 100 * ( total_this_today / total_yesterday - 1 ) AS percent_increase_this_today,
       100 * ( total_this_week / total_last_week - 1 ) AS percent_increase_this_week,
       100 * ( total_this_iso_week / total_last_iso_week - 1 ) AS percent_increase_this_iso_week,
       100 * ( total_this_7_days / total_last_7_days - 1 ) AS percent_increase_this_7_days,
       100 * ( total_this_month / total_last_month - 1 ) AS percent_increase_this_month
FROM   (
  SELECT SUM(
           CASE
           WHEN "DATE" >= TRUNC( SYSDATE )
           AND  "DATE" <=  SYSDATE
           THEN AMOUNT
           ELSE NULL
           END
         ) AS total_today,
         SUM(
           CASE
           WHEN "DATE" >= TRUNC( SYSDATE ) - INTERVAL '1' DAY
           AND  "DATE" <  TRUNC( SYSDATE )
           THEN AMOUNT
           ELSE NULL
           END
         ) AS total_yesterday,
         SUM(
           CASE
           WHEN "DATE" >= NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '7' DAY, 'SUNDAY' )
           AND  "DATE" <= SYSDATE
           THEN AMOUNT
           ELSE NULL
           END
         ) AS total_this_week,
         SUM(
           CASE
           WHEN "DATE" >= NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '14' DAY, 'SUNDAY' )
           AND  "DATE" <  NEXT_DAY( TRUNC( SYSDATE ) - INTERVAL '7' DAY, 'SUNDAY' )
           THEN AMOUNT
           ELSE NULL
           END
         ) AS total_last_week,
         SUM(
           CASE
           WHEN "DATE" >= TRUNC( SYSDATE, 'IW' ),
           AND  "DATE" <= SYSDATE
           THEN AMOUNT
           ELSE NULL
           END
         ) AS total_this_iso_week,
         SUM(
           CASE
           WHEN "DATE" >= TRUNC( SYSDATE, 'IW' ) - INTERVAL '7' DAY,
           AND  "DATE" <  TRUNC( SYSDATE, 'IW' )
           THEN AMOUNT
           ELSE NULL
           END
         ) AS total_last_iso_week,
         SUM(
           CASE
           WHEN "DATE" >= TRUNC( SYSDATE ) - INTERVAL '6' DAY,
           AND  "DATE" <= SYSDATE
           THEN AMOUNT
           ELSE NULL
           END
         ) AS total_this_7_days,
         SUM(
           CASE
           WHEN "DATE" >= TRUNC( SYSDATE ) - INTERVAL '13' DAY,
           AND  "DATE" <  TRUNC( SYSDATE ) - INTERVAL '6' DAY
           THEN AMOUNT
           ELSE NULL
           END
         ) AS total_last_7_days,
         SUM(
           CASE
           WHEN "DATE" >= TRUNC( SYSDATE, 'MM' )
           AND  "DATE" <= SYSDATE
           THEN AMOUNT
           ELSE NULL
           END
         ) AS total_this_month
         SUM(
           CASE
           WHEN "DATE" >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
           AND  "DATE" <  TRUNC( SYSDATE, 'MM' )
           THEN AMOUNT
           ELSE NULL
           END
         ) AS total_this_month
  FROM   tb_sales
  WHERE  "DATE" >= ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), -1 )
  AND   "DATE"  <= SYSDATE
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...