sql server把退款總金額拆分到盡量少的多個訂單中詳解
一、問題
原來有三個充值訂單,現(xiàn)在要退款450元,如何分配才能讓本次退款涉及的充值訂單數(shù)量最少?具體數(shù)據(jù)參考下圖:

二、解決方案
Step 1:對可退金額進行降序排列,以便優(yōu)先使用可退金額比較大的訂單
Step 2:使用CTE公用表達式,實現(xiàn)類似for或while循環(huán)或游標的功能
三、腳本
create table #t
(
充值 int,
已退 int,
可退 int
)
insert into #t(充值, 已退, 可退)
values (200, 100, 100), (500, 200, 300), (300, 100, 200)
/*
作者:zhang502219048
腳本來源:https://www.cnblogs.com/zhang502219048/p/14127208.html
*/
declare @i要退 int = 450;
with cte1 as
(
select *, row_number() over(order by 可退 desc) rn, 0 可發(fā)起退款, 0 待退
from #t
),
cte2 as
(
select rn, 充值, 已退, 可退,
可發(fā)起退款 = case when @i要退 > 可退 then 可退 else @i要退 end,
待退 = @i要退 - case when @i要退 > 可退 then 可退 else @i要退 end -- 待退 = 要退 - 可發(fā)起退款
from cte1
where rn = 1
union all
select t2.rn, t2.充值, t2.已退, t2.可退,
可發(fā)起退款 = case when t1.待退 > t2.可退 then t2.可退 else t1.待退 end,
待退 = t1.待退 - case when t1.待退 > t2.可退 then t2.可退 else t1.待退 end
from cte1 t2
inner join cte2 t1 on t1.rn = t2.rn - 1 -- t2是t1的下一條記錄
--where t2.rn > 1 and t1.待退 > 0
)
select * from cte2
drop table #t
四、腳本運行結(jié)果

總結(jié)
到此這篇關于sql server把退款總金額拆分到盡量少的多個訂單中的文章就介紹到這了,更多相關sql server退款總金額拆分到訂單內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SQL Server 2005 還原數(shù)據(jù)庫錯誤解決方法
解決SQL Server 2005 還原數(shù)據(jù)庫錯誤:System.Data.SqlClient.SqlError: 在對 'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\BusinessDB.mdf' 嘗試 'RestoreContainer::ValidateTargetForCreation' 時,操作系統(tǒng)返回了錯誤 '5(拒絕訪問)'2009-03-03
SQLServer 2005 實現(xiàn)數(shù)據(jù)庫同步備份 過程-結(jié)果-分析
簡單來說,數(shù)據(jù)庫復制就是由兩臺服務器,主服務器和備份服務器,主服務器修改后,備份服務器自動修改2012-06-06
SQL Server中數(shù)據(jù)行批量插入腳本的存儲實現(xiàn)
這篇文章主要介紹了SQL Server中數(shù)據(jù)行批量插入腳本的存儲實現(xiàn) 的相關資料,需要的朋友可以參考下2015-12-12
Sql中將datetime轉(zhuǎn)換成字符串的方法(CONVERT)
這篇文章主要介紹了Sql中將datetime轉(zhuǎn)換成字符串的方法,需要的朋友可以參考下2014-04-04
SQL?server插入報錯:當?IDENTITY_INSERT?設置為?OFF?時不能為表?‘XXX‘?
這篇文章主要介紹了SQL?server插入報錯:當?IDENTITY_INSERT?設置為?OFF?時,不能為表?‘XXX‘?中的標識列插入顯式值的問題,該問題是給SQL server數(shù)據(jù)庫中的某個表插入數(shù)據(jù)引起的報錯,一般出現(xiàn)在該表為自增的情況下,本文給大家分享解決方法,需要的朋友可以參考下2023-09-09
SQLServer中bigint轉(zhuǎn)int帶符號時報錯問題解決方法
用一個函數(shù)來解決SQLServer中bigint轉(zhuǎn)int帶符號時報錯問題,經(jīng)測試可用,有類似問題的朋友可以參考下2014-09-09

