a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 數(shù)據(jù)庫 > 文庫 > 正文

用計(jì)算列實(shí)現(xiàn)移動(dòng)加權(quán)平均算法

2020-10-29 21:53:33
字體:
供稿:網(wǎng)友
復(fù)制代碼 代碼如下:

if OBJECT_ID('tb') is not null drop table tb
if OBJECT_ID('TEMP') is not null drop table TEMP
if OBJECT_ID('FUN_NOWPRICE') is not null drop FUNCTION FUN_NOWPRICE
if OBJECT_ID('FUN_NOWQTY') is not null drop FUNCTION FUN_NOWQTY
go

create table tb(
id INT
,Date1 datetime
,ctype varchar(10)
,qnt float
,pri float
)

--qnt 數(shù)量
--pri 單價(jià)
insert tb
select 0,'2009-1-1', '進(jìn)貨', 10, 100 union all
select 1,'2009-1-1', '進(jìn)貨', 50, 120 union all
select 2,'2009-1-2', '出貨', 30, 150 union all
select 3,'2009-1-3', '進(jìn)貨', 40, 130 union all
select 4,'2009-1-3', '出貨', 25, 160
GO
-- 我要算成本價(jià),按移動(dòng)加權(quán)平均

/*
1進(jìn)貨以后的成本價(jià)c1=(10*100+50*120)/(10+50)
2出貨以后的成本價(jià)c2=((10+50)*c1-30*c1)/((10+50)-30)=C2
--也就是說出貨的時(shí)候價(jià)格不變
3進(jìn)貨以后的成本價(jià)c3=(((10+50)-30)*c2+40*130)/((10+50)-30+40)
--也就是說進(jìn)貨的時(shí)候單價(jià)更新為(當(dāng)前庫存的總價(jià)值+庫總價(jià)值)/入庫后總數(shù)量


以此類推...
*/

--想了半天,覺得只能用循環(huán)、遞歸、游標(biāo)實(shí)現(xiàn),因?yàn)槌鰩鞎r(shí)的價(jià)格是根據(jù)之前的記錄算出來的。
--也許有經(jīng)典的算法,誰知道的麻煩教教我或者發(fā)個(gè)鏈接。

--這個(gè)FUNCTION就是變相實(shí)現(xiàn)遞歸的
CREATE FUNCTION FUN_NOWPRICE(@ID INT)
RETURNS NUMERIC(19,6)
AS
BEGIN
RETURN (SELECT ISNULL(NOWPRICE,0) FROM
(SELECT MAX(NOWPRICE) 'NOWPRICE' FROM TEMP T1 WHERE ID<@ID AND
NOT EXISTS(SELECT 1 FROM TEMP WHERE ID>T1.ID AND ID<@ID))
T)
END
GO
--這個(gè)FUNCTION是為了計(jì)算方便
CREATE FUNCTION FUN_NOWQTY(@ID INT)
RETURNS NUMERIC(19,6)
AS
BEGIN
RETURN (SELECT ISNULL(SUM(CASE CTYPE WHEN '進(jìn)貨' THEN QNT ELSE 0-QNT END),0) FROM TEMP WHERE ID<@ID)
END
GO


--建一個(gè)臨時(shí)表,包含原表參與運(yùn)算的全部字段
create table TEMP(
id INT
,Date1 datetime
,ctype varchar(10)
,qnt float
,pri float
,NOWPRICE AS
CASE ctype
WHEN '出貨' THEN DBO.FUN_NOWPRICE(ID)
ELSE (DBO.FUN_NOWPRICE(ID)*DBO.FUN_NOWQTY(ID)+QNT*PRI)/(DBO.FUN_NOWQTY(ID)+QNT)
END)


INSERT INTO TEMP
SELECT * FROM TB
ORDER BY DATE1 ASC,ID ASC

SELECT * FROM TEMP

/*
0 2009-01-01 00:00:00.000 進(jìn)貨 10 100 100
1 2009-01-01 00:00:00.000 進(jìn)貨 50 120 116.666666666667
2 2009-01-02 00:00:00.000 出貨 30 150 116.666667
3 2009-01-03 00:00:00.000 進(jìn)貨 40 130 124.285714428571
4 2009-01-03 00:00:00.000 出貨 25 160 124.285714
*/

這個(gè)寫法的不完善處在于它是根據(jù)ID和日期對記錄進(jìn)行排序的,對于同一天的出入庫情況沒有處理。實(shí)際運(yùn)用中可以根據(jù)CREATEDATE等時(shí)間標(biāo)志性字段來進(jìn)行排序。
--------------------------------------------------------------------------------

第一次寫技術(shù)性博客,希望這是一個(gè)好的開始,歡迎大家對我的算法進(jìn)行指正^_^
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 成人综合在线观看 | 成人在线日韩 | 精品久久久久久久久久久久久久 | 免费一级淫片 | 久久精品久久综合 | 午夜视频一区 | yy6080久久伦理一区二区 | 欧美成人精品一区二区男人小说 | 亚洲视频自拍 | 青青草视频免费在线观看 | 五月激情六月婷婷 | 九九亚洲 | 狠狠久久| 亚洲乱码一区二区 | 日韩黄色在线观看 | www.日韩大片 | 日批在线观看 | 久久久久久久国产 | 黄色毛片网站在线观看 | 午夜精品久久久久 | 午夜影视在线观看 | 天天插天天操天天干 | 久久网页 | 99久久99久久精品 | 网址国产 | www一区 | 亚洲色图一区二区三区 | 欧美精品网 | 国产在线一区观看 | 日韩a∨ | 91精品在线观看入口 | 国产一区二区观看 | 欧美日韩在线观看中文字幕 | 91中文字幕在线观看 | 蜜桃毛片| 国产99久 | 亚洲精品乱码久久久久久按摩观 | 日韩精品一区二区三区四区 | 高清国产一区二区三区四区五区 | 日韩二区三区 | 国产福利在线观看 |