資料多次分攤方案二
方案一有很多的不足,優化以後效率提升很多
DECLARE @GSID VARCHAR(5)
SET @GSID ='01001'
/*拼接資料*/
CREATE TABLE #THZ(
ID INT NOT NULL IDENTITY(1,1)
,GSID VARCHAR(5) NULL DEFAULT ''
,KH VARCHAR(40) NULL DEFAULT ''
,WL VARCHAR(40) NULL DEFAULT ''
,PH VARCHAR(40) NULL DEFAULT ''
,DJ DECIMAL(20,8) NULL DEFAULT 0.00000000
,SL DECIMAL(14,2) NULL DEFAULT 0.00
)
INSERT INTO #THZ (GSID,KH,WL,PH,DJ,SL)
SELECT '01001','01001-JZT166','01001-JQ000005','190220',1.00000000,10.00 UNION ALL
SELECT '01001','01001-JZT166','01001-JQ000005','190220',2.00000000,2.00 UNION ALL
SELECT '01001','01001-JZT166','01001-JQ000005','190220',3.00000000,300.00 UNION ALL
SELECT '01001','01001-JZT166','01001-JQ000005','190220',3.10000000,12.00 UNION ALL
SELECT '01001','01001-JZT166','01001-JQ000005','190220',3.20000000,12.00 UNION ALL
SELECT '01001','01001-JZT166','01001-JQ000005','190220',3.30000000,1.00 UNION ALL
SELECT '01001','01001-JZT166','01001-JQ000005','190220',3.40000000,2.00 UNION ALL
SELECT '01001','01001-JZT167','01001-JQ000005','190220',3.50000000,3.00
CREATE TABLE #LX_SJ(
ID INT NOT NULL IDENTITY(1,1)
,GSID VARCHAR(5) NULL DEFAULT ''
,NY VARCHAR(6) NULL DEFAULT ''
,LSBH VARCHAR(40) NULL DEFAULT ''
,FLBH VARCHAR(40) NULL DEFAULT ''
,YWRQ VARCHAR(40) NULL DEFAULT ''
,KH VARCHAR(40) NULL DEFAULT ''
,WL VARCHAR(40) NULL DEFAULT ''
,PH VARCHAR(40) NULL DEFAULT ''
,SL DECIMAL(14,2) NULL DEFAULT 0.00
,SYSL DECIMAL(14,2) NULL DEFAULT 0.00
)
INSERT INTO #LX_SJ (GSID,NY,LSBH,FLBH,YWRQ,KH,WL,PH,SL)
SELECT '01001','202001','No0001','0001','20200116','01001-JZT166','01001-JQ000005','190220',3.00 UNION ALL
SELECT '01001','202001','No0002','0001','20200107','01001-JZT166','01001-JQ000005','190220',20.00 UNION ALL
SELECT '01001','202001','No0003','0001','20200107','01001-JZT166','01001-JQ000005','190220',3.00 UNION ALL
SELECT '01001','202001','No0004','0001','20200106','01001-JZT166','01001-JQ000005','190220',20.00 UNION ALL
SELECT '01001','202001','No0005','0001','20200116','01001-JZT167','01001-JQ000005','190220',8.00 UNION ALL
SELECT '01001','202001','No0006','0001','20200107','01001-JZT167','01001-JQ000005','190220',20.00 UNION ALL
SELECT '01001','202001','No0007','0001','20200107','01001-JZT167','01001-JQ000005','190220',3.00 UNION ALL
SELECT '01001','202001','No0008','0001','20200106','01001-JZT167','01001-JQ000005','190220',5.00
SELECT * FROM #THZ
--SELECT * FROM #LX_SJ WHERE KH ='01001-JZT166' ORDER BY GSID,NY,KH,WL,PH,YWRQ
CREATE TABLE #LX_SJFT(
ID INT NOT NULL
,XGID INT
,GSID VARCHAR(5) NULL DEFAULT ''
,NY VARCHAR(6) NULL DEFAULT ''
,LSBH VARCHAR(40) NULL DEFAULT ''
,FLBH VARCHAR(40) NULL DEFAULT ''
,YWRQ VARCHAR(40) NULL DEFAULT ''
,KH VARCHAR(40) NULL DEFAULT ''
,WL VARCHAR(40) NULL DEFAULT ''
,PH VARCHAR(40) NULL DEFAULT ''
,DJ DECIMAL(20,8) NULL DEFAULT 0.00000000
,SL DECIMAL(14,2) NULL DEFAULT 0.00
,UPSL DECIMAL(14,2) NULL DEFAULT 0.00
,FTSL DECIMAL(14,2) NULL DEFAULT 0.00
)
DECLARE @FT_KH VARCHAR(40)
,@FT_WL VARCHAR(40)
,@FT_PH VARCHAR(40)
,@FT_DJ DECIMAL(20,8)
,@FT_SL DECIMAL(14,2)
/*定義遊標*/
DECLARE CURSOR_LXFT CURSOR FOR
SELECT KH,WL,PH,DJ,SL FROM #THZ WHERE SL <> 0 FOR READ ONLY
/*開啟遊標*/
OPEN CURSOR_LXFT
/*指標下移*/
FETCH NEXT FROM CURSOR_LXFT INTO @FT_KH,@FT_WL,@FT_PH,@FT_DJ,@FT_SL
WHILE @@fETCH_STATUS = 0
BEGIN
INSERT INTO #LX_SJFT (ID,XGID,GSID,NY,LSBH,FLBH,YWRQ,KH,WL,PH,DJ,SL,UPSL,FTSL)
SELECT ROW_NUMBER() OVER(ORDER BY a.YWRQ ASC) AS ID,a.ID AS XGID,a.GSID,a.NY,a.LSBH,a.FLBH,a.YWRQ,a.KH,a.WL,a.PH,@FT_DJ,a.SL - ISNULL(a.SYSL,0.00),@FT_SL,0
FROM #LX_SJ AS a
WHERE a.GSID = @GSID AND a.KH =@FT_KH AND a.WL = @FT_WL AND a.PH =@FT_PH AND a.SL - ISNULL(a.SYSL,0.00) > 0
ORDER BY a.YWRQ ASC
IF (SELECT COUNT(*) FROM #LX_SJFT) > 0
BEGIN
DECLARE @TMP_UPSL DECIMAL(14,2) /*分攤結果*/
,@TMP_FTSL DECIMAL(14,2) /*需要分攤的數量*/
SET @TMP_UPSL = 0
/*取值*/
SELECT TOP 1 @TMP_FTSL = UPSL FROM #LX_SJFT
IF EXISTS(SELECT 1 FROM #LX_SJFT WHERE SL >= UPSL)
BEGIN
UPDATE #LX_SJFT
SET @TMP_FTSL = @TMP_FTSL - @TMP_UPSL
,@TMP_UPSL = CASE WHEN SL >= @TMP_FTSL THEN @TMP_FTSL ELSE 0 END
,FTSL = @TMP_UPSL
END
ELSE
BEGIN
UPDATE #LX_SJFT
SET @TMP_FTSL = @TMP_FTSL - @TMP_UPSL
,@TMP_UPSL = CASE WHEN SL >= @TMP_FTSL THEN @TMP_FTSL ELSE CASE WHEN SL > 0 THEN SL ELSE 0 END END
,FTSL = @TMP_UPSL
END
UPDATE a
SET a.SYSL = ISNULL(a.SYSL,0.00) + ISNULL(b.FTSL,0.00)
FROM #LX_SJ AS a
INNER JOIN #LX_SJFT AS b ON a.ID = b.XGID
WHERE b.FTSL > 0
END
/*刪除臨時表*/
DELETE #LX_SJFT
/*指標下移*/
FETCH NEXT FROM CURSOR_LXFT INTO @FT_KH,@FT_WL,@FT_PH,@FT_DJ,@FT_SL
END
/*關閉遊標*/
CLOSE CURSOR_LXFT
/*清除遊標*/
DEALLOCATE CURSOR_LXFT
DROP TABLE #THZ
DROP TABLE #LX_SJ
DROP TABLE #LX_SJFT
相關文章
- 金額分攤sqlSQL
- 擺攤江湖:用資料思維拆解擺攤經濟
- 資料庫分庫分表解決方案彙總資料庫
- django REST fromework 序列化時多次查詢資料庫的解決方案DjangoREST資料庫
- MySQL資料庫之分庫分表方案MySql資料庫
- 分庫解決方案—資料儲存
- OGG資料庫遷移方案(二)資料庫
- 百度地攤經濟搜尋大資料大資料
- Discuz!NT資料庫讀寫分離方案資料庫
- append插入不能多次未提交插入資料APP
- mysql 時間型別秒級資料,取分鐘資料方案MySql型別
- 眾至科技資料防洩露解決方案① | 資料識別及分類分級
- 常見資料庫的分頁實現方案資料庫
- 資料結構-二分搜尋樹資料結構
- MySQL 資料庫之網際網路常用分庫分表方案MySql資料庫
- jQuery中click事件多次觸發解決方案jQuery事件
- 資料容災技術及容災方案分類
- 6-1 二分查詢 (20分) PTA 資料結構資料結構
- CO聯產品成本差異分攤計算邏輯
- 【資料庫訪問優化方案之讀寫分離】資料庫優化
- laravel chunk 分塊後 第二塊資料是物件Laravel物件
- 資料結構之PHP二分搜尋樹資料結構PHP
- 【資料庫使用-oracle索引的建立和分類】二資料庫Oracle索引
- 【資料結構】折半查詢(二分查詢)資料結構
- 多次使用一個con,資料庫連線是否會僵死?資料庫
- 資料治理與資料分類分級!
- 樹形結構資料儲存方案(二): 物化路徑
- 知物由學 | 輿情資料清洗“動”“靜”分離方案
- 大資料資料庫讀寫分離分庫分表大資料資料庫
- 資料結構與演算法-二分查詢資料結構演算法
- 多工學習中的資料分佈問題(二)
- 【資料結構與演算法】—— 二分查詢資料結構演算法
- [資料結構] 二分查詢 (四種寫法)資料結構
- 資料劃分
- 資料分類
- 分組資料
- 分庫分表插入資料
- 資料庫分庫分表資料庫