У меня есть стол с хранилищем.Есть 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
=> вход больше, чем память.
Строка "XYZ - 3" игнорируется, поскольку InAmount0 = 2
И Amount0 = 10 - 9 = 1
=> вход больше, чем хранилище.
Мне нужны быстрые результаты, но я могу выделить много памяти.Среднее количество строк в таблице хранения составит ~ 10K, а в таблице потребления и производства - ~ 25K.
Я думаю, CTE будет правильным решением, но я не смог сделать это правильно.
РЕДАКТИРОВАТЬ: Исходные данные могут быть доступны в виде значения ключа:
Таблица хранения:
IDCity | Kind | Amount
ABC | 0 | 25
ABC | 1 | 7
...
XYZ | 0 | 10
XYZ | 1 | 6
Таблица потребления и производства:
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
...