统计历史全量数据时,个别天数某个企业缺数的优化处理

1、遇到的问题和数据的需求

  • 结果的主键为日期+企业id,假设总共有10个企业,当某个企业当日没有数据时会导致改天统计出来的数据条数为9个
  • 这时很多人想到使用企业档案左关联数据即可解决这个问题,但是这个时候会随之产生一个问题,当数据的统计日期为多天时,是无法通过简单的左关联产生全量的日期+企业的数据

2、解决思路

  • 在原先准备落库的数据做一次优化,计算出涉及的日期
  • 把涉及的日期和企业档案进行一个全关联
  • 最后把全关联的结果集,左关联每日数据,关联不上的数据补0即可

3、代码示例

-- 未优化之前准备落库的数据
@some_value:=
SELECT  a.stat_date      			-- 日期
        ,b.comp_no   				-- 公司编码
        ,b.comp_name      			-- 公司名称
        ,sum(value1)		as value1		-- 第一个值
        ,sum(value2)		as value2		-- 第二个值
        ,sum(value3)		as value3		-- 第三个值
FROM    table_source a
JOIN    table_comp b 
ON      a.cust_no = b.cust_no
WHERE   a.ds between '20240101' and '20240131'
    and LENGTH(a.ds)=8
    and ISDATE(a.ds,'yyyymmdd')=TRUE
    and a.stat_date=a.ds
group by a.stat_date     
,b.serial_num   
,b.imp_comp     
order by a.stat_date     
,b.serial_num   
,b.imp_comp 
;


-- 抽出涉及的日期
@all_date:=
select 
stat_date
,'1'    as join_key
from @some_value
group by stat_date
;

-- 抽出涉及的公司
@all_comp:=
select 
comp_no
,max(comp_name)   as comp_name
,'1'    as join_key
from table_comp
group by comp_no
;

-- 全关联日期和公司
@all_date_comp:=
select 
stat_date
,comp_no
,comp_name
from @all_date t1
join @all_comp t2 on t1.join_key=t2.join_key
;

-- 准备落库,已经补全了个别天数某个公司没数据的问题
select 
    t1.stat_date
    ,t1.comp_no
    ,t1.comp_name
    ,nvl(value1   	,0) 	as value1   
    ,nvl(value2	,0) 	as value2
    ,nvl(value3   	,0) 	as value3   
    ,getdate()      as extend_field_update_time
    ,null           as extend_field_1
    ,null           as extend_field_2
    ,null           as extend_field_3
    ,t1.stat_date      as ds
from @all_date_comp t1
left join @some_value t2 on t1.stat_date=t2.stat_date and t1.comp_no=t2.comp_no
order by 
t1.stat_date
,t1.comp_no
;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值