Изменение запроса множественного выбора в запрос CTE - PullRequest
0 голосов
/ 06 июня 2019

Я хочу изменить этот конкретный простой запрос на выборку в CTE, чтобы оптимизировать его, поскольку этот простой три запроса на выборку занимает 4 минуты и, следовательно, я хочу сократить время его выполнения, преобразовав его в запрос CTE.

select sum(AMOUNT) usd from data where status IN ('ACCEPTED','REJECTED','CANCELLED') and date between '01-SEP-18' and '30-NOV-18' 
UNION 
select sum(AMOUNT) usd from data where status IN ('ACCEPTED','REJECTED','CANCELLED') and date between '01-NOV-18' and '31-JAN-19' 
UNION 
select sum(AMOUNT) usd from data where status IN ('ACCEPTED','REJECTED','CANCELLED') and date between '01-FEB-19' and '30-APR-19' 
ORDER BY usd DESC ;

Ожидаемый результат должен состоять из одного столбца, показывающего результат трех запросов, который является суммой в виде usd от суммы в этом запросе.

Пример:

USD
100 (timeline 1)
200 (timeline 2)
300 (timeline 3)

Тот, который я пробовал: Можете ли вы преобразовать этот запрос CTE с помощью суммы вместо количества.

WITH cte AS (
    SELECT
        COUNT(CASE WHEN status_date BETWEEN '2018-11-01' AND '2019-01-31' THEN 1 END) AS cnt1,
        COUNT(CASE WHEN status_date BETWEEN '2019-02-01' AND '2019-04-30' THEN 1 END) AS cnt2,
        COUNT(CASE WHEN status_date BETWEEN '2019-05-01' AND '2019-07-31' THEN 1 END) AS cnt3
    FROM data
    WHERE status IN ('ACCEPTED', 'REJECTED', 'CANCELLED')
)

SELECT cnt1 FROM cte
UNION ALL
SELECT cnt2 FROM cte
UNION ALL
SELECT cnt3 FROM cte;

1 Ответ

0 голосов
/ 06 июня 2019

Я предполагаю, что вы не хотите, чтобы сроки перекрывались, поэтому:

select (case when date between '01-SEP-18' and '30-NOV-18' then 'timeline1'
             when date between '01-DEC-18' and '31-JAN-19' then 'timeline2'
             when date between '01-FEB-19' and '30-APR-19' then 'timeline3'
        end), sum(AMOUNT) as usd
from data
where status IN ('ACCEPTED','REJECTED','CANCELLED') and 
     date between '01-SEP-18' and '30-APR-19'
group by (case when date between '01-SEP-18' and '30-NOV-18' then 'timeline1'
               when date between '01-DEC-18' and '31-JAN-19' then 'timeline2'
               when date between '01-FEB-19' and '30-APR-19' then 'timeline3'
        end)
order   by usd desc;

Если вы это сделаете, отдельные столбцы, вероятно, проще:

select sum(case when date >= date '2018-09-01' and date < date '2018-12-01' then amount end) as usd_timeline1,
       sum(case when date >= date '2018-11-01' and date < date '2019-02-01' then amount end) as usd_timeline2
       sum(case when date >= date '2019-02-01' and date '2019-05-01' then amount end) as usd_timeline3
from data
where status IN ('ACCEPTED','REJECTED','CANCELLED') and 
      date >= date '2018-09-01' and date < date '2019-05-01'
order by usd desc;

Обратите внимание, что этоиспользует константы даты, используя стандартный формат YYYY-MM-DD и ключевое слово date.

...