数据库中如何使用计算列实现移动加权平均算法
这篇文章给大家分享的是有关数据库中如何使用计算列实现移动加权平均算法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
代码如下:
ifOBJECT_ID('tb')isnotnulldroptabletbifOBJECT_ID('TEMP')isnotnulldroptableTEMPifOBJECT_ID('FUN_NOWPRICE')isnotnulldropFUNCTIONFUN_NOWPRICEifOBJECT_ID('FUN_NOWQTY')isnotnulldropFUNCTIONFUN_NOWQTYgocreatetabletb(idINT,Date1datetime,ctypevarchar(10),qntfloat,prifloat)--qnt数量--pri单价inserttbselect0,'2009-1-1','进货',10,100unionallselect1,'2009-1-1','进货',50,120unionallselect2,'2009-1-2','出货',30,150unionallselect3,'2009-1-3','进货',40,130unionallselect4,'2009-1-3','出货',25,160GO--我要算成本价,按移动加权平均/*1进货以后的成本价c1=(10*100+50*120)/(10+50)2出货以后的成本价c2=((10+50)*c1-30*c1)/((10+50)-30)=C2--也就是说出货的时候价格不变3进货以后的成本价c3=(((10+50)-30)*c2+40*130)/((10+50)-30+40)--也就是说进货的时候单价更新为(当前库存的总价值+库总价值)/入库后总数量以此类推...*/--想了半天,觉得只能用循环、递归、游标实现,因为出库时的价格是根据之前的记录算出来的。--也许有经典的算法,谁知道的麻烦教教我或者发个链接。--这个FUNCTION就是变相实现递归的CREATEFUNCTIONFUN_NOWPRICE(@IDINT)RETURNSNUMERIC(19,6)ASBEGINRETURN(SELECTISNULL(NOWPRICE,0)FROM(SELECTMAX(NOWPRICE)'NOWPRICE'FROMTEMPT1WHEREID<@IDANDNOTEXISTS(SELECT1FROMTEMPWHEREID>T1.IDANDID<@ID))T)ENDGO--这个FUNCTION是为了计算方便CREATEFUNCTIONFUN_NOWQTY(@IDINT)RETURNSNUMERIC(19,6)ASBEGINRETURN(SELECTISNULL(SUM(CASECTYPEWHEN'进货'THENQNTELSE0-QNTEND),0)FROMTEMPWHEREID<@ID)ENDGO--建一个临时表,包含原表参与运算的全部字段createtableTEMP(idINT,Date1datetime,ctypevarchar(10),qntfloat,prifloat,NOWPRICEASCASEctypeWHEN'出货'THENDBO.FUN_NOWPRICE(ID)ELSE(DBO.FUN_NOWPRICE(ID)*DBO.FUN_NOWQTY(ID)+QNT*PRI)/(DBO.FUN_NOWQTY(ID)+QNT)END)INSERTINTOTEMPSELECT*FROMTBORDERBYDATE1ASC,IDASCSELECT*FROMTEMP/*02009-01-0100:00:00.000进货1010010012009-01-0100:00:00.000进货50120116.66666666666722009-01-0200:00:00.000出货30150116.66666732009-01-0300:00:00.000进货40130124.28571442857142009-01-0300:00:00.000出货25160124.285714*/
这个写法的不完善处在于它是根据ID和日期对记录进行排序的,对于同一天的出入库情况没有处理。实际运用中可以根据CREATEDATE等时间标志性字段来进行排序。
感谢各位的阅读!关于“数据库中如何使用计算列实现移动加权平均算法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。