SQL - как суммировать по разным строкам, имея другое уравнение для первой строки - PullRequest
0 голосов
/ 20 января 2019

У меня возникают проблемы с вычислением суммирования по разным строкам, но с использованием первого ряда каждой группировки в качестве отправной точки.

У меня есть таблица, которая выглядит следующим образом:

+------+------+----------+---------------+----------+-------+
| Dim1 | Dim2 |   Date   | beg_Inventory | purchase | sales |
+------+------+----------+---------------+----------+-------+
| x    | y    | 1/1/2019 |           100 |       50 |    20 |
| x    | y    | 1/2/2019 |               |       70 |    80 |
| x    | y    | 1/3/2019 |               |       40 |    60 |
| x    | y    | 1/4/2019 |               |       30 |    50 |
| x    | y    | 1/5/2019 |               |      100 |    10 |
| x    | z    | 1/1/2019 |            65 |       10 |    50 |
| x    | z    | 1/2/2019 |               |       20 |     5 |
| x    | z    | 1/3/2019 |               |       40 |     5 |
+------+------+----------+---------------+----------+-------+

И я хочу получить результат, который выглядит следующим образом:

+------+------+----------+---------------+----------+-------+------------+
| Dim1 | Dim2 |   Date   | beg_Inventory | purchase | sales | ending_inv |
+------+------+----------+---------------+----------+-------+------------+
| x    | y    | 1/1/2019 |           100 |       50 |    20 |        130 |
| x    | y    | 1/2/2019 |               |       70 |    80 |        120 |
| x    | y    | 1/3/2019 |               |       40 |    60 |        100 |
| x    | y    | 1/4/2019 |               |       30 |    50 |         80 |
| x    | y    | 1/5/2019 |               |      100 |    10 |        170 |
| x    | z    | 1/1/2019 |            65 |       10 |    50 |         25 |
| x    | z    | 1/2/2019 |               |       20 |     5 |         40 |
| x    | z    | 1/3/2019 |               |       40 |     5 |         75 |
+------+------+----------+---------------+----------+-------+------------+

Конечный инвентарь - начальная_инвентаризация + покупка -продаж, для первой строки в каждой группе dim1 и dim2, т.е. для первой строки это 100 + 50-20 = 130. Однако во 2-й строке необходимо использовать 130, которые мы рассчитали, и использовать покупки и продажи вследующий ряд, чтобы получить 130 + 70-80 = 120 и т. д., сгруппированные по dim1 и dim2 и упорядоченные по дате.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Формулы для всех строк выглядят одинаково для меня:

SELECT t.*,
       SUM(COALESCE(beg_Inventory, 0) + purchase - sales) OVER (PARTITION BY dim1, dim2 ORDER BY date) as ending_inv
FROM t
ORDER BY dim1, dim2, date;
0 голосов
/ 20 января 2019

Попробуйте и используйте first_value(), чтобы получить первое значение beg_inventory в окне, а затем добавьте в окно sum() покупок и продаж к нему.

SELECT dim1,
       dim2,
       date,
       beg_inventory,
       purchase,
       sales,
       first_value(beg_inventory) OVER (PARTITION BY dim1,
                                                     dim2
                                        ORDER BY date)
       +
       sum(purchase - sales) OVER (PARTITION BY dim1,
                                                dim2
                                   ORDER BY date) ending_inv
       FROM elbat
       ORDER BY dim1,
                dim2,
                date;
...