mysql8 hive oracle 窗口函数,分摊金额

注:技术交流可以加我VX:k-loop,昵称:默读者。

需求:

一个订单2000块钱对应4个子订单,这笔订单优惠了200块钱,然后将200块钱需要根据子订单的金额/订单2000块钱,进行分摊。但是最后一笔,需要用200-之前3比分摊出去的金额,这样4笔子订单加一块才是200元。

-- 创建订单表
create table `order`(
id int, -- 订单id
price DOUBLE -- 订单金额
);
-- 插入订单数据
insert into `order` values(1,2000);
insert into `order` values(2,3000);

-- 创建子订单表
create table order_sub(
id int, -- 子订单id
order_id int, -- 订单id
price DOUBLE -- 子订单金额
);

-- 插入子订单数据
insert into order_sub values(1,1,100);
insert into order_sub values(2,1,700);
insert into order_sub values(3,1,900);
insert into order_sub values(4,1,300);

insert into order_sub values(5,2,1400);
insert into order_sub values(6,2,500);
insert into order_sub values(7,2,1100);

-- 创建优惠券表
create table awords(
id int, -- 优惠券id
order_id int, -- 订单id
price DOUBLE -- 优惠券金额
);

-- 插入优惠券数据
insert into awords values(1,1,200);
insert into awords values(2,2,250);

数据准备妥当,下面开始代码编写

​
SELECT
she.id
,she.`订单ID`
,she.`子订单金额`
,she.`订单优惠金额`
,CASE WHEN she.MM=1 THEN she.`订单优惠金额`-she.`分摊优惠券金额累加`+she.`分摊优惠券金额` ELSE she.`分摊优惠券金额` END `分摊优惠券金额`
FROM (
SELECT
hh.*
,ROW_NUMBER() OVER(PARTITION BY hh.`订单ID` ORDER BY hh.`子订单金额`) MM
FROM (
SELECT
s.id
,s.order_id `订单ID`
,s.price `子订单金额`
,o.price `订单总金额`
,aw.price `订单优惠金额`
,ROUND(s.price/o.price,2) AS  `子订单金额占比`
,aw.price*ROUND(s.price/o.price,2) AS `分摊优惠券金额`
,SUM(aw.price*ROUND(s.price/o.price,2)) OVER (PARTITION BY s.order_id ORDER BY s.price DESC) AS `分摊优惠券金额累加` 
FROM order_sub s -- 子订单表
LEFT JOIN `order` o -- 订单表
ON s.order_id = o.id
LEFT JOIN awords aw -- 优惠券表
ON s.order_id=aw.order_id
) hh
) she

​

运行结果如下:

订单ID为1的,优惠券金额200元。订单金额是2000元,下图没有列出这一列。共4个子订单,根据子订单金额进行优惠券的分摊

叮当ID为2的,优惠券金额250元。订单金额是3000元,下图没有列出这一列。共3个子订单,根据子订单金额进行优惠券的分摊

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值