Выполнение суммирования значений из таблицы до совпадения со значением из другой таблицы - PullRequest
0 голосов
/ 09 октября 2018

У меня есть 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 Ответ

0 голосов
/ 09 октября 2018

Промежуточная сумма определяется с помощью 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

DB Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...