SQL面试题挑战08:补全缺失日的月销售累计

SQL面试题挑战08:补全缺失日的月销售累计

问题

问题:现有一张员工的销售记录表,表样式如下图。现在需要统计每个员工在2021年10月份,截止到每天的月累计销售额。注意:存在有的员工在某几天是没有销售记录的。

原来表:

sale_dateemp_idemp_namesale_amount
2021-10-02101张三100
2021-10-03101张三300
2021-10-05101张三400
2021-10-01102李四111
2021-10-03102李四222
2021-10-08102李四333

补全后

sale_dateemp_idemp_namesale_amount
2021-10-01101张三0
2021-10-02101张三100
2021-10-03101张三400
2021-10-04101张三400
2021-10-05101张三800
2021-10-06101张三800
2021-10-01102李四111
2021-10-02102李四111
2021-10-03102李四333

建表语句

drop table if exists sales;
create table sales(
    sale_date date,
    emp_id varchar(20),
    emp_name varchar(20),
    sale_amount int
);
insert into sales values
('2021-10-02','101','张三',100),
('2021-10-03','101','张三',300),
('2021-10-05','101','张三',400),
('2021-10-01','102','李四',111),
('2021-10-03','102','李四',222),
('2021-10-08','102','李四',333)

解答

思路:

由于缺乏一些日期,所以我们先要把日期进行补全,使用递归查询生成日期范围,并和姓名连接,然后和sales左连接即可。

完整查询如下

with recursive dateList as (
    select '2021-10-01' as sale_date
    union all
    select sale_date + interval 1 day
    from dateList
    where sale_date < '2021-10-31'
),tmp as(
    select
        sale_date,
        emp_id,
        emp_name
    from
        dateList
        left join(
            select
                emp_id,
                emp_name
            from
                sales
            group by
                emp_id,
                emp_name
        ) t0 on 1

)

 select
    t.sale_date,
    t.emp_id,
    t.emp_name,
    sum(ifnull(sale_amount,0))over (partition by t.emp_id order by t.sale_date)sale_amount
 from
     tmp t
    left join sales s on t.emp_id=s.emp_id and t.sale_date=s.sale_date

注:在Hive中可以用lateral view posexplode补全日期。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值