我有存储表。 “amount”有20列,可以是零或更大(不能为空)。
IDCity | Amount0 | Amount1 | ... Amount19
---------------------------------------------------
ABC | 25 | 7 | ...
... ... ... ...
XYZ | 10 | 6 | ...
消费和消费表生产。输入“金额”有20列,“输出”金额有20列。 “OrderNumber”列的值从1到“N”。这些值是连续的。
IDCity | OrderNumber | InAmount0 | InAmount1 | OutAmount0 | OutAmount1 | ...
----------------------------------------------------------------------------
ABC | 1 | 0 | 0 | 10 | 0 | ...
ABC | 2 | 30 | 0 | 0 | 16 | ...
ABC | 3 | 0 | 14 | 7 | 0 | ...
...
XYZ | 1 | 0 | 9 | 21 | 0 | ...
XYZ | 2 | 9 | 0 | 0 | 19 | ...
XYZ | 3 | 2 | 0 | 0 | 4 | ...
...
我需要迭代“消费和生产”中的行并更新每个城市的存储量。我希望通过“InAmount”列减小值,并通过“OutAmount”列增加值。
但是,如果InAmount1 < Amount1 OR InAmount2 < Amount2 OR ...
必须忽略该行。
样本的结果应为:
IDCity | Amount0 | Amount1 | ... Amount19
---------------------------------------------------
ABC | 12 | 9 | ...
... ... ... ...
XYZ | 1 | 25 | ...
忽略“XYZ - 1”行,因为InAmount1 = 9
AND Amount1 = 6
=&gt;输入大于存储。
忽略“XYZ - 3”行,因为InAmount0 = 2
AND Amount0 = 10 - 9 = 1
=&gt;输入大于存储。
我需要快速结果,但我可以分配大量内存。存储表的平均行数约为10K,消费和生产表的平均行数约为25K。
我猜CTE将是正确的解决方案,但我无法做到这一点。
编辑:源数据可以键值形式提供:
存储表:
IDCity | Kind | Amount
ABC | 0 | 25
ABC | 1 | 7
...
XYZ | 0 | 10
XYZ | 1 | 6
消费&amp;生产表:
IDCity | OrderNumber | InKind1 | InAmount1 | InKind2 | InAmount2 | OutKind | OutAmount
ABC | 1 | NULL | NULL | NULL | NULL | 0 | 10
ABC | 2 | 0 | 30 | NULL | NULL | 1 | 16
ABC | 3 | 1 | 14 | NULL | NULL | 0 | 7
...