Sql Server迭代选择/更新

时间:2011-08-16 17:01:50

标签: sql-server select common-table-expression iteration

我有存储表。 “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
...

0 个答案:

没有答案