00:00
那接下来咱们就来,哎,琢磨琢磨啊,咱们这个分摊咱们这怎么去做。其实这里边儿难点啊,难点其实在哪,难点是不是就在这个分摊上面啊。那那就在分摊上面啊,如果说没有这几个分摊金额,如果说没有这几个分摊金额啊,那你说咱们这张表的出具装载怎么做就可以了。直接从ODI层O底天佑那张表把当天分区的数据拿过来,是不是就完事了呀,对不对啊,但是这儿呢,我有几个分摊金额,那分摊金额呢,我必须得先拿到这个商品项所在订单的金额,我是不是才能进行分摊呀,对不对?那问一下大家怎么拿到这个商品项所在订单的金额,各种金额怎么拿到?招呗,对不对,我是不是用这张表去和order后招对不对,O里边是不是有这个订单的所有的金额呀,哎招,那招到之后呢,我再去进行分摊等等这些操作对不对啊,那这个怎么做呀,具体怎么实现呢?
01:02
哎,咱们来先把两个子查询写上吧,已既然已经明确了,我需要用ods层的order detail和ods层的order去join对吧?那所以咱们现在呢,先把这两个大学先写了啊,首先select啊,来先from哪张表,先from OS层的older detail,因为这个实时表它的数据来源主要就是它吧,啊啊,那当然我们只需要只要什么,只需要最近一天分区对吧?那V2DT啊,等于2020杠零几零六杠幺四啊。啊1114啊幺四写在这,那咱这呢,写个谁带就行。哎,好,已经拿到这个older,呃,Detail当天分区了啊好,那紧接着呢,我们需要用这张表去和older say older in for去join对不对,那又要跟older in for join了,因为older还是什么,还是每日新增级变化,对吧,那咱们又得考虑我join它这个最新一天行不行?啊,行不行啊。
02:01
行不行啊,行不行,咱琢磨琢磨行不行。行不行?肯定行,为啥你要知道啊,这张表是什么表?是增量表对不对?它里边是不是只存每天新增的订单的订单明细,那O点引报呢,是每日的新增及变化,那肯定包含新增了,所以说join肯定是没问题的啊,那这个大家应该是可以放心的去join啊,回车V啊,在这个里边呢,我们有一个ODS啊,Order in for,那好,这个是能join的啊好,那这俩子量菌咱们分别给它几个别名啊,先放到括号里吧,来回车。CTRLV啊,这个呢,往前推一下啊,这个起别名咱们叫做OI啊,这个oo,诶这个是OD对吧?Order detail咱们叫OD啊OD。一个一个主持人的名字是吧,欧弟来。来往先推一下啊,这个我们叫做OI啊O啊,那他俩进行照,那还是那个问题啊,就是既然又涉及到这呢,那咱们采用哪种照应方式呢?啊,因为咱们最终目的是不是要这这个表里边的数据啊,这是咱们的主体啊呃,这时候用谁啊。
03:12
Left run对吧,但是因为下边这个包含上面那个,所以用谁都行是吧?哎,Inner或者left都可以,那咱们就直接join吧,啊join然后呢,把这个连接条件也写一下吧,啊,应该是OD点,哎,O的ID等于谁等于oi.id是不是照上了呀?那剩下的事呢,就是从这俩哎子查询里边去查询就行了啊s from啊啊那关键是咱们的from什么东西啊。啊,反射命中器啊,反射命中器你是不是得看你那需要什么东西啊,对不对,那首先上边呢,我需要这么多的这个字段啊,这么多字段,那这么多字段呢,其实呃,在哪张表里边都有啊,在咱们的older detail当中其实都有,你看啊,你可以拿一下啊,我们找到older detail order o.detail啊,咱们把这个尖面语呢,给它盯一下啊,F3啊,给它盯在这个位置,那我们再回到刚才的位置,你看一下啊,你可以对比一下这些字段。
04:11
啊,这些字段啊,在这张表当中,哎,咱们都是有的啊,都是有的啊,那谁没有呢?Pro ID没有,还有谁没有,是不是还有这些分摊的什么,呃,运费啊,优惠以及最终金额,是不是咱们o.detail里边是没有的呀?啊是这样的,那有些需要计算,有些可以直接拿,那哪些直接拿呀,像这样的是不是咱们都可以直接拿过来啊,那现在咱们先把这些可以直接拿的字段呢,先给它拿过来啊,那比如说也就是这里边怎么写啊,第一个字段啊,那就OD点应该是谁呀?ID哎,拿过来,那第二个你所需的字段是什么?是order ID,那你就接着从OD里边去拿就行了,od.oid啊,这个咱们就不再一个个写了啊,咱们把这个呃能拿的字段呢,咱们先直接拿过来啊,我现在把这个呃,文档上粘过来吧,这个我就不再手写了啊,这个浪费时间啊,来,咱把它拿过来,CTRLC。
05:05
哎,放到这块CTRLV。来,那这个可以往下推一下啊,选中,然后shift type往回退一下啊来大家看一下看这啊,那这些字段全部都来自于哪OD,也就是o detail对吧,只有这个province ID是从哪来的,是从O做来的,能看懂对吧?啊行,那这个没问题啊,那接下来我们开始进入到下边这个哎,度量值的计算了啊度量值计算首先第一个就是这个,哎。Original amount啊,就是一个商品箱啊,占的咱们那个什么呀,占咱们整个订单里边的一个原始金额啊,所谓的分摊这个怎么算呀。原金额怎么算呀?原始金额我是不是用自己这个商品的单价乘以我的数量,是不是就得到这个所谓的原始金额的分摊了呀?哎,它俩一乘就完事啊,这个比较简单啊,它其实涉及不到这个分摊的计算啊,那就直接OD点啊,应该是呃,O哎,Price啊,然后呢,乘以一个od.sku number是不是搞定了?哎,很简单啊,这因为咱们度量值比较多,我加一个标注啊,这个我们叫做哎,原始金额,哎,咱们也叫分摊吧,啊分摊啊,原始金额分摊啊,那这边呢,咱们也起一个别名吧,一会因为会用到它啊,咱们就叫什么呢?就叫做or j original amount a amount_D啊分摊啊,Original amount d,好,这个是原始金额分摊搞定了,那接下来咱们搞一下下边这个啊。
06:42
搞下边这个谁,下边这个该谁了?Final amount d对不对,是不是该搞他了呀?那这个怎么搞。嗯。这怎么搞啊?嗯,或者咱不搞他了,咱们搞一个这个比较容易理解的吧,咱们搞其实他们仨都一样啊这种逻辑的,咱们搞谁搞下面这个搞这个优惠对吧,搞优惠啊,优惠分摊。
07:04
啊,又是分摊,那既然要分摊了,咱是必须得有一个分摊的逻辑才行啊,对不对,那咱们这儿呢,没有特殊的这个业务逻辑,没有特殊要求,那我们就按什么分摊呀。啊,如果没有特殊要求的话,那咱们按啥按原价的比例进行分摊,是不是就可以了。啊,这个怎么理解啊,来我们举个例子,假如说我现在呢,有一个订单啊,下了一个订单,那这个订单呢,我比如说啊,我商品A商品A,那我的原价呢,比如说是诶20,那我的商品B呢,是30原价啊商品C我的原价是多少?50啊就50吧。OK,那然然后这个订单的总金额一共是多少。原原始的总结100对吧?啊,然后我优惠了一点,优惠了多少呢?优惠比如说优惠了20块钱买100减20对不对,因为咱这里边并没有特别的这个特殊的含那个业务要求,所以说我们这呢,就直接按照这个原价的比例分摊,那这个分摊到每个商品线之后应该是多少呢?20,然后分到A商品是多少呢。
08:11
能算明白不?四块呗,对吧?啊,那这个呢多少啊,六块啊,这个呢就是十块,是不是应该是这样的一个逻辑啊,对不对,按照比例分摊,那这个四怎么来的呀?四怎么来呢?是不是应该是20乘以什么乘以这个20:100对不对,那这个六怎么来的呢?应该是20乘以30:100,是不是得到六了呀?哎,是这样一个逻辑,那所以咱们这儿呢,因为没有特殊的要求,我们就按照这个比例去分摊,按原始金额的比例分摊啊,那所以这儿应该怎么办?首先你是不是得先拿到这个商品项所在订单的。什么呀,那个优惠金额吧,这个去哪呢?从I里边能拿到,所以说从OA里边呢,先拿到谁先拿到你那个优惠金额应该是benefit啊reduce amount是不是拿到了,是那个订单的总的优惠金额对不对,那我要算的是一个分摊的,所以说应该成吧,是谁。
09:13
是不是乘以我这个商品项的原始金额啊,占谁占整个订单总原始金额的一个比例,是不是就得到这个分摊的优惠了呀,对不对,那所以咱们需要先把这个拿过来,它拿过来作为什么呀,作为分子对不对,然后那谁作为分母,是不是整个订单当中总的那个商品项啊,总的那个原始金额作为分母啊,那应该是OI点,呃,这里边它这个报错了是吧,我们看一下啊啊,我把这个别名是不是也粘过来了呀。别名不能要啊来拿过来应该乘以谁乘以OI里边的,哎,总的这个原始金额啊,总原始金额original total amount,哎,那这样一来咱们是不是就得到了一个啊啊除对是除是除没错,哎,好,那这样一来咱们是就得到了我们诶所需的这个分摊的优惠金额了呀,诶就是这样的啊相当于这个呢,是呃总的优惠金额,那后边呢,是我这个呃,一个分摊的比例搞定啊就这么搞呗,啊那当然呢,这么搞的话呢,我们需要去处理一下啊,因为这里边咱们涉及到了一个什么,涉及到一个除法对吧?说除法呢,那这里边就可能会出现那种就是无限循环,无或就出现无限小说对吧?那一般情况下,咱们在这个涉及到金额的时候,一般我们考虑几位小数啊。
10:38
保留两位啊,肯定是保留两位小数啊啊到分嘛,那所以这块呢,咱们需要给它做一个啊四舍五入啊,那怎么做呀,来给大家介绍一个函数,叫做乳round的啊round的啊就是四舍五入,然后这个函数呢,需要传俩参,一个参呢就是你的那个小数,第二一个参数呢,就是你要保留的位数,保留两位小数,哎,那这个就是我们分摊的优惠金额,那咱们这写一下啊,那字段名拿上面那个叫做benefit reduce amount d,那剩下的那个分摊原理呢,其实都一样,这个我就不再把这个全重复了,他们俩都是照着这个频率去做就可以了啊是这样的啊啊,那是不是感觉咱们这儿是再把那俩字段补上这个词汇就写完了呀。
11:21
是不是是这样吗?要是这样他就没什么难度了,对吧,这有啥难的呀,这里边呢,大家得跟我考虑一个问题啊,考虑个什么问题,因为我们这儿呢,是不是涉及到了这个啥呀,涉及到了这个呃,就是四舍五入的对不对,涉及四舍五入呢?嗯,就会考,就得考虑一个什么问题啊。就是一个精度损失的一个问题啊,什么问题呢,咱们来看一下啊。假如说我现在举一个这样例,刚才咱们那个比例是正好能整除,对吧,大家假如现在不能整除啊,比如不能整除的话,比如说我现在我这个整个的订单一共比如说花了30块钱,然后我也是买了三件商品啊,虽然每件商品我都是十块钱。
12:04
但是不是金额相同,对不对,然后呢,我优惠了多少钱呢,优惠了十块钱。啊,满30减十这个优惠力度还挺大是吧?啊,然后优惠完之后你看啊,我假如说也是按照这个逻辑去计算分摊,那你说我这个每个每个商品项应该分到多少优惠啊,它应该是3.333,因为十乘1/3嘛,对不对,但是咱们保留两位小数应该多少3.33,那这个呢,3.33下边呢,也是3.33,诶你会发现啊,他们几个分完之后,我再加起来,我是不是并不等于这个总的优惠金额呀,就那很显然这个是有问题,你这么写还真不行啊。那所以这时候我们就得考虑到一个,哎,这种不能整除的问题啊,不能整除那咱们得怎么办,你说这个问题你要让你解决,你怎么解决呀?啊先不考虑C怎么写啊,咱就说这个逻辑上你怎么处理它比较合适啊。对于这种情况。
13:03
哎,对没错,对于这种情况呢,咱们首先先把那个误差先找出来,对不对啊,找出来多少啊,是不是用十减去你这个分摊。分摊运费之和呀,对不对,先拿你这个总的,呃,优惠不是运费啊,是优惠啊,先拿到你总的优惠,然后呢,再拿到你这个分摊之后的这个优惠之和,然后它俩相减,是不是得到误差了,对不对,误差就是多少0.01,然后找到这个误差之后呢,再怎么办?再从咱们这三个产品线当中任意找一个,是不是找一个呀,对吧,找一个去,哎,把这个误差给他补偿上去就可以了,比如说第一个,那就它相当于是三点。是不是三四啊,是不是就可以了。对不对,这是咱们解决这个问题的一个方案嘛,啊就这么解决好,那方案大家都清楚了,那这个so咋写对吧,咱们现在要落实到这个server落地啊,这个so咋写啊,来,我把视频先录一下。
我来说两句