sql-запрос выберите два периода для получения дохода

#sql #postgresql

#sql #postgresql

Вопрос:

как можно сравнить два периода, используя, например, один запрос:

 SELECT s_campaign_id, COALESCE(SUM(f_revenue),0) AS revenue FROM tbl_reports WHERE (d_gen_date>='2020-12-15' AND d_gen_date<='2020-12-16') GROUP BY s_campaign_id
 

и сравните это с доходом другого периода в том же запросе, например, я хочу получить список доходов за период 1 период 2

 SELECT s_campaign_id, COALESCE(SUM(f_revenue),0) AS revenue FROM tbl_reports WHERE (d_gen_date>='2020-12-15' AND d_gen_date<='2020-12-16') as revenue1  AND (d_gen_date>='2019-12-13' AND d_gen_date<='2020-12-14') as revenue2 GROUP BY s_campaign_id
 

Спасибо

Ответ №1:

Вы могли бы использовать ФИЛЬТР:

 SELECT
    s_campaign_id
    , COALESCE ( SUM ( f_revenue ) FILTER(WHERE d_gen_date >= '2020-12-15' AND d_gen_date <= '2020-12-16'), 0 ) AS revenue1 
    , COALESCE ( SUM ( f_revenue ) FILTER(WHERE d_gen_date >= '2019-12-13' AND d_gen_date <= '2020-12-14'), 0 ) AS revenue2 
FROM
    tbl_reports 
WHERE
    ( d_gen_date >= '2020-12-15' AND d_gen_date <= '2020-12-16' )
OR  
    ( d_gen_date >= '2019-12-13' AND d_gen_date <= '2020-12-14' ) 
GROUP BY
    s_campaign_id;
 

Ответ №2:

Используйте условную агрегацию и OR выполните следующие действия:

 SELECT s_campaign_id, 
       SUM(case when d_gen_date>='2020-12-15' AND d_gen_date<='2020-12-16' 
                then f_revenue end) AS revenue1,
       SUM(case when d_gen_date>='2020-12-13' AND d_gen_date<='2020-12-14'  
                then f_revenue end) AS revenue2
  FROM tbl_reports 
 WHERE (d_gen_date>='2020-12-15' AND d_gen_date<='2020-12-16')  
    OR (d_gen_date>='2019-12-13' AND d_gen_date<='2020-12-14')
GROUP BY s_campaign_id
 

Комментарии:

1. спасибо, если доход равен нулю, как его можно установить равным 0?