【发布时间】:2012-07-23 22:46:49
【问题描述】:
我正在编写一个 SQLServer 2008 存储过程,它采用一个付款表并尝试根据相关表中描述的一组规则(基本上是一组存储桶)分配这些付款。然而,目前让我头疼的是分配(将支付值放入存储桶)。
假设表 Payments 包含要支付的值,而表 Buckets 是关于应该在每个桶中放入多少,直到要支付的初始值用完(达到 0)。
使用下表作为示例(实际用例有点做作,因为有一些复杂的标准可以选择适合每次付款的存储桶):
PaymentId Value BucketId MaxAmount
-------------------------- --------------------------------
1 16.5 1 5.5
2 7.0 2 10
3 8.3
对于付款 1:5.5 单位(该桶的最大值)应放入桶 1,10 单位应放入桶 2(11.5 是桶 1 的余数,但仍超过桶 2 的最大值)和 1 单位(16.5 - 5.5 - 10) 应放入存储桶 3。重复所有付款。
这很容易在任何命令式语言中实现,甚至可能在带有 for/while 循环的 SQL 中实现,但我试图意识到是否有更好的方法(即使它是不可移植的并且特定于 SQLServer 2005+)。
我进行了一些研究(主要是递归 CTE),但没有想到真正出色的东西。我敢肯定有很多 StackOverflowers 使用 SQL-fu 可以从他们的脑海中回答这个问题,所以我想把它放在那里看看......
非常感谢您的帮助。
【问题讨论】:
-
您的存储桶表中是否有任何表示订单的内容?否则你的结果几乎是不确定的。另外,您的数据类型是什么,您是否需要担心随机舍入问题?
-
@X-Zero - 桶表中没有顺序。只要数量不超过每个桶的最大值,并且将总值分配给一个或多个桶,就可以将任何付款分配给桶。四舍五入问题绝对重要。数据类型为十进制(18,6),但舍入到小数点后第三位。
-
您可能想阅读 SQL CLR 并查看它是否比纯 Transact-SQL 解决方案更容易访问。
-
好的,如果你有一个
DECIMAL类型,你应该没问题(尤其是你没有乘法/除法)。如果我在我的 DB2 版本中这样做,我需要使用递归 CTE;但是,如果 2008 年有一些额外的 OLAP 功能(我认为是LAG/LEAD),您应该能够在没有它们的情况下做到这一点。 -
你可能会发现一些有用的想法here。
标签: sql sql-server sql-server-2008