点击上方【蓝色】字体 关注我们

01 场景描述
一块钱平均分3份,总数加起来等于1块?如何用一条SQL实现了?最终结果如下

02 数据准备
create table all_money asselect 1 as all_money, 1 as numunion allselect 1 as all_money, 2 as numunion allselect 1 as all_money, 3 as num

03 问题分析
步骤1:计算平均金额
select all_money, num, cast(1 COUNT(*) over () as decimal(18, 4)) avg_money, row_number() over (order by num desc) rnfrom all_money

第二步:计算累计平均金额
select all_money, num, avg_money, rn, sum(avg_money) over (order by rn desc) acc_avg_moneyfrom (select all_money, num, cast(1 COUNT(*) over () as decimal(18, 4)) avg_money, row_number() over (order by num desc) rnfrom all_money) t

第三步:计算分摊金额
select num,case when rn != 1 then avg_money else (1 - acc_avg_money) + avg_money end moneyfrom(select all_money, num, avg_money, rn, sum(avg_money) over (order by rn desc) acc_avg_moneyfrom (select all_money, num, cast(1 COUNT(*) over () as decimal(18, 4)) avg_money, row_number() over (order by num desc) rnfrom all_money) t) t

04 小 结
文章利用SQL语言给出了一种均分后的分摊算法,具体应用场景如下:
已知车辆编号,总运费,货主姓名,货主货物金额,现在需要货主按照货物金额的占比去分担运费,要求所有货主分担的运费和等于总运费。该场景具体实现读者自行完成。

会飞的一十六
扫描右侧二维码关注我们
点个【在看】 你最好看

往期精彩
文章转载自会飞的一十六,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。






