Выполнение суммирования значений из таблицы до совпадения со значением из другой таблицы
У меня есть 2 таблицы.
Таблица 1 является таблицей временных переменных:
declare @Temp as table ( proj_num varchar(10), sum_dom decimal(23,8))
Моя временная таблица заполнена списком номеров проектов и суммой в долларах на конец месяца.
Например:
proj_num | sum_dom
11522 | 2477.15
11524 | 26474.20
41865 | 9012.10
Таблица 2 является таблицей транзакций проекта. Нас интересуют только следующие столбцы:
proj_num
amount
cost_code
tran_date
Индивидуальные ценности будут примерно такими:
proj_num | cost_code | amount | tran_date
11522 | LBR | 112.10 | 10/1/2018
11522 | LBR | 1765.90 | 10/2/2018
11522 | MAT | 599.15 | 10/3/2018
11522 | FRT | 57.50 | 10/4/2018
Таким образом, для этого проекта, так как общая сумма в 2477,15 долл. США достигнута 10/3, пример вывода будет следующим:
proj_num | cost_code | amount
11522 | LBR | 1878.00
11522 | MAT | 599.15
Я хочу суммировать суммы (сгруппированные по cost_code и упорядоченные по tran_date) в таблице транзакций проекта, пока общая сумма значений для этого значения проекта не совпадет со значением в столбце sum_dom временной таблицы, и в этот момент я выведу данные.
Можете ли вы помочь мне понять, как написать запрос для этого? Я знаю, что мне следует избегать курсоров, но мне пока не повезло с моими попытками. Кажется, я не могу заставить его держать промежуточный итог.
1 ответ
Промежуточная сумма делается с помощью SUM(...) OVER (ORDER BY ...)
, Вам просто нужно сказать, где остановиться:
SELECT sq.*
FROM projects
INNER JOIN (
SELECT
proj_num,
cost_code,
amount,
SUM(amount) OVER (PARTITION BY proj_num ORDER BY tran_date) AS running_sum
FROM project_transactions
) AS sq ON projects.proj_num = sq.proj_num
WHERE running_sum <= projects.sum_dom