有点凌乱,但这里是我想出了:
代码来设置你的基本表.. 。
-- setup code
CREATE TABLE #tmp (
[NO] int identity(1,1),
[TRAN] money,
[REFUND] money
)
INSERT #tmp VALUES (100, 0)
INSERT #tmp VALUES (200, 0)
INSERT #tmp VALUES (300, 0)
代码添加到您的退款金额...
DECLARE @amt money SET @amt = 50
UPDATE u
SET REFUND =
CASE WHEN u.[REFUND] = u.[TRAN] THEN u.[REFUND] --'already full - do nothing'
WHEN cumulativepretran >= aiming_for_ref THEN u.[REFUND] --'after all - do nothing'
WHEN cumulativetran + cumulativeref > ((totalref + @amt) - u.[TRAN]) THEN (totalref + @amt + u.[REFUND]) - (cumulativeref) --'calc'
ELSE u.[TRAN] END -- 'fill-er-up'
FROM #tmp u
INNER JOIN (SELECT *,
ISNULL((select sum([REFUND]) FROM #tmp WHERE [NO] <= t.[NO]), 0) 'cumulativeref',
ISNULL((select sum([TRAN]) FROM #tmp WHERE [NO] <= t.[NO]), 0) 'cumulativetran',
ISNULL((select sum([REFUND]) FROM #tmp WHERE [NO] < t.[NO]), 0) 'cumulativepreref',
ISNULL((select sum([TRAN]) FROM #tmp WHERE [NO] < t.[NO]), 0) 'cumulativepretran',
ISNULL((select sum([REFUND]) FROM #tmp), 0) 'totalref',
ISNULL((select sum([REFUND]) FROM #tmp), 0) + @amt 'aiming_for_ref'
FROM #tmp t) as m ON m.[NO] = u.[NO]
不太清楚 - 你能更好地解释如何** **你从第一状态得到第二,然后到第三??你的意思是*如果退款是350 * - **什么**退款?什么专栏?我在第一种状态下根本看不到任何退款......并且您如何从第二种状态获得第三种状态? 50你的退款是什么意思?为什么它只应用于第三行?规则是什么** ?? – 2011-05-19 07:24:21
当你说“一个”陈述时 - 你在问什么。这将是一个简单的存储过程,其中声明的变量用于跟踪退款金额和一个逐行应用的while循环,直到退款全部用完。但是这符合你对单一陈述的期望吗?对我而言,任何以单一“批次”运行的东西都是一种陈述。 – RThomas 2011-05-19 07:27:29
您的退款金额是否分摊到每笔交易中。通过这个我的意思是它需要350然后开始在TRANAMT No1,起飞100,然后移动到No2,需要200,然后移动到No3采取过去50. – kevchadders 2011-05-19 07:46:05