#tempR 表
iPriority_num GCAMOUNT
221143 2000.00
221255 1500.00
#tempV 表
iPriority_num sPlu_cd iDetail_num siTem_cd ITEMAMOUNT
221143 0660 1 ACN00660 6000.00
221255 0112 1 CON00112 500.00
221255 0134 2 HAI00134 750.00
221255 0851 3 FPR50074 249.00
221255 0008 4 FNU30200 300.00
221255 0856 5 MICO0001 297.00
这是我的脚本
SELECT t.iPriority_num as [TransactionID]
,t.iDetail_num as [Order ID],t.sPlu_cd AS [ItemCode]
,t.ITEMAMOUNT
,d.GCAMOUNT as [GC Payment]
,CASE WHEN d.GCAMOUNT < t.ITEMAMOUNT
THEN (d.GCAMOUNT / CAST((SELECT COUNT(*) as cnt FROM #tempV t2 where t.iPriority_num = t2.iPriority_num) AS decimal(10,2)))
ELSE
d.GCAMOUNT − t.ITEMAMOUNT
END AS DistributedAmt
FROM #tempV t
INNER JOIN #tempR dON d.iPriority_num = t.iPriority_num
结果
TransactionID OrderID ItemCode ITEMAMOUNT GC Payment DistributedAmt
221143 1 0660 6000.00 2000.00 2000.00
221255 1 0112 500.00 1500.00 1000.00
221255 2 0134 750.00 1500.00 750.00
221255 3 0851 249.00 1500.00 1251.00
221255 4 0008 300.00 1500.00 1200.00
221255 5 0856 297.00 1500.00 1203.00
期望的输出
TransactionID OrderID ItemCode ITEMAMOUNT GC Payment DistributedAmt
221143 1 0660 6000.00 2000.00 2000.00
221255 1 0112 500.00 1500.00 500.00
221255 2 0134 750.00 1500.00 750.00
221255 3 0851 249.00 1500.00 249.00
221255 4 0008 300.00 1500.00 1.00
221255 5 0856 297.00 1500.00 0.00
我想要的只是如果项目金额小于GC付款,则分配每个项目的金额
这个东西在sql server 2000中通常需要游标或者三角连接。
一个潜在的解决方案:
select *
into #tempR
from (
SELECT 221143, 2000.00
UNION ALL
SELECT 221255, 1500.00
) t (iPriority_num,GCAMOUNT)
select *
into #tempV
from (
SELECT 221143, N'0660', 1, N'ACN00660', 6000.00
UNION ALL SELECT 221255, N'0112', 1, N'CON00112', 500.00
UNION ALL SELECT 221255, N'0134', 2, N'HAI00134', 750.00
UNION ALL SELECT 221255, N'0851', 3, N'FPR50074', 249.00
UNION ALL SELECT 221255, N'0008', 4, N'FNU30200', 300.00
UNION ALL SELECT 221255, N'0856', 5, N'MICO0001', 297.00
) t (iPriority_num,sPlu_cd,iDetail_num,siTem_cd,ITEMAMOUNT)
select *
, CASE WHEN DistributedAmt < 0 THEN 0 ELSE DistributedAmt END AS FinalDistributedAmount
from (
select t.*
, case
when r.GCAMOUNT >= (SELECT SUM(itemamount) FROM #tempV v where v.iPriority_num = t.iPriority_num AND v.iDetail_num <= t.iDetail_num) THEN t.ItemAmount
ELSE r.GCAmount - ISNULL((SELECT SUM(itemamount) FROM #tempV v where v.iPriority_num = t.iPriority_num AND v.iDetail_num < t.iDetail_num), 0)
END AS DistributedAmt
from #tempV t
INNER JOIN #tempR r
ON r.iPriority_num = t.iPriority_num
) x
可以通过执行
(SELECT SUM(itemamount) FROM #tempV v where v.iPriority_num = t.iPriority_num AND v.iDetail_num <= t.iDetail_num)
子查询来生成运行总和,然后与要分配的原始金额的剩余部分进行比较。
不幸的是,它需要一些重复,你应该考虑升级到更现代的版本