繁体   English   中英

在 SQL 的列中获取上一年的汇总值

[英]Getting previous year aggregated values in column in SQL

我在 sale_date grain 有数据,我想将前两年的总销售数字与当前日期相对应。 我正在维护一个日期维度表,其中每个日历日都有前一年的日期。

我尝试的解决方案是在与日期维度连接的同时使用与主表的交叉连接。 但是由于表将来会增长,交叉连接会导致性能问题。 寻找一些改进建议

    with date_dim as (
    select '2022-08-25'::date as calendar_day,
           '2021-08-01'::date as prev_yr_date,
           '2020-07-01'::date as prev_two_yr_date
    union all
    select '2021-08-01'::date as calendar_day,
           '2020-08-01'::date as prev_yr_date,
           '2019-07-01'::date as prev_two_yr_date
    union all
    select '2020-07-01'::date as calendar_day,
           '2019-08-01'::date as prev_yr_date,
           '2018-07-01'::date as prev_two_yr_date
),
     main_data as (
         select '2022-08-25'::date as sale_date, 10 as sale
         union all
         select '2021-08-01'::date as sale_date, 20 as sale
         union all
         select '2020-07-01'::date as sale_date, 30 as sale
     )
select a.sale_date,
       sum(case when b.sale_date = d.calendar_day then b.sale else 0 end)     as current_Sale,
       sum(case when b.sale_date = d.prev_yr_date then b.sale else 0 end)     as prev_yr_sale,
       sum(case when b.sale_date = d.prev_two_yr_date then b.sale else 0 end) as prev_two_yr_sale

from main_data a
         cross join main_data b
         inner join date_dim d on a.sale_date = d.calendar_day
group by 1

输入数据:

在此处输入图像描述

Output 来自我的查询:

在此处输入图像描述

with date_dim as (
    select '2022-08-25'::date as calendar_day,
           '2021-08-01'::date as prev_yr_date,
           '2020-07-01'::date as prev_two_yr_date
    union all
    select '2021-08-01'::date as calendar_day,
           '2020-08-01'::date as prev_yr_date,
           '2019-07-01'::date as prev_two_yr_date
    union all
    select '2020-07-01'::date as calendar_day,
           '2019-08-01'::date as prev_yr_date,
           '2018-07-01'::date as prev_two_yr_date
),
     main_data as (
         select '2022-08-25'::date as sale_date, 10 as sale
         union all
         select '2021-08-01'::date as sale_date, 20 as sale
         union all
         select '2020-07-01'::date as sale_date, 30 as sale
     )

SELECT d.calendar_day,sum(case when a.sale_date = d.calendar_day then a.sale else 0 end)     as current_Sale,
       sum(case when a.sale_date = d.prev_yr_date then a.sale else 0 end)     as prev_yr_sale,
       sum(case when a.sale_date = d.prev_two_yr_date then a.sale else 0 end) as prev_two_yr_sale
from main_data a join date_dim d on a.sale_date=d.calendar_day or a.sale_date=d.prev_yr_date or a.sale_date=d.prev_two_yr_date
group by 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM