Как посчитать сумму?

В postgresql с использованием запроса

WITH RECURSIVE rel_rec AS (
    SELECT
            1 AS depth,
            *,
            ARRAY[lvl] AS child_path
        FROM types_of_work
        WHERE parent_id IS NULL AND project_id = 14

        UNION ALL
        SELECT
            nlevel(r.path) + 1,
            n.*,
            r.child_path || n.lvl
        FROM rel_rec AS r
        JOIN types_of_work AS n ON n.parent_id = r.tow_id
        WHERE r.project_id = 14
)
SELECT
    t0.tow_id,
    t0.project_id,
    t0.path,
    t0.child_path,
    t0.lvl,
    t0.parent_id,
    t0.depth,
    t2.tow_cost
FROM rel_rec t0
LEFT JOIN (
    SELECT
        tow_id,
        tow_cost,
        tow_cost_percent,
        tow_date_start,
        tow_date_finish
    FROM tows_contract
    WHERE contract_id = 10
) AS t2 ON t0.tow_id = t2.tow_id
ORDER BY t0.child_path, t0.lvl;

мы получим стол

tow_id целое число дерево пути дочерний_путь smallint[] уровень smallint родительский_ид целое число целое число глубины стоимость числовая CUULATIVE_COST 39 корень {1} 1 нулевой 1 ∑ 90 40 корень.39 {1,2} 2 39 2 10 131 корень.39 {1,3} 3 39 2 10 41 корень.39 {1,4} 4 39 2 10 46 корень.39 {1,5} 5 39 2 ∑ 60 47 корень.39.46 {1,5,6} 6 46 3 ∑ 30 48 корень.39.46.47 {1,5,6,7} 7 47 4 ∑ 10 134 корень.39.46.47.48 {1,5,6,7,8} 8 48 5 10 49 корень.39.46.47 {1,5,6,9} 9 47 4 10 125 корень.39.46.47 {1,5,6,10} 10 47 4 10 132 корень.39.46 {1,5,11} 11 46 3 ∑ 20 133 корень.39.46.132 {1,5,11,12} 12 132 4 10 135 корень.39.46.132 {1,5,11,13} 13 132 4 10 136 корень.39.46 {1,5,14} 14 46 3 ∑ 10 657 корень.39.46.136 {1,5,14,15} 15 136 4 10 142 корень {16} 16 нулевой 1 ∑ 30 143 корень.142 {16,17} 17 142 2 ∑ 30 178 корень.142.143 {16,17,18} 18 143 3 10 146 корень.142.143 {16,17,19} 19 143 3 10 147 корень.142.143 {16,17,20} 20 143 3 10 42 корень {21} 21 нулевой 1 ∑ 10 43 корень.39.42 {21,22} 22 42 2 ∑ 10 45 корень.39.42.43 {21,22,23} 23 43 3 ∑ 10 671 корень.39.42.43.45 {21,22,23,24} 24 45 4 ∑ 10 672 корень.39.42.43.45.671 {21,22,23,24,25} 25 671 5 10

Как добавить в эту таблицу рассчитанную сумму затрат всех вложенных дочерних элементов? Примером этой суммы является столбец CUMULATIVE_COST. Представленная таблица представляет собой древовидную систему. Столбец depth показывает уровень вложенности. В столбце parent_id показан tow_id родительского объекта.

минимальный, воспроизводимый пример:

CREATE TABLE types_of_work (
    tow_id integer,
    path ltree,
    lvl integer,
    project_id integer,
    parent_id  integer
);
CREATE TABLE tows_contract (
    tow_id integer,
    cost integer,
    contract_id integer
);

INSERT INTO types_of_work (tow_id, path, project_id, lvl, parent_id)
    VALUES (39, 'root', 14, 1, null),
    VALUES (40, 'root.39', 14, 2, 39),
    VALUES (131, 'root.39', 14, 3, 39),
    VALUES (41, 'root.39', 14, 5, 39),
    VALUES (46, 'root.39', 14, 5, 39),
    VALUES (47, 'root.39.46', 14, 6, 46),
    VALUES (48, 'root.39.46.47', 14, 7, 47),
    VALUES (134, 'root.39.46.47.48',  14, 8, 48),
    VALUES (49, 'root.39.46.47', 14, 9, 47),
    VALUES (125, 'root.39.46.47', 14, 10, 47),
    VALUES (132, 'root.39.46', 14, 11, 46),
    VALUES (133, 'root.39.46.132', 14, 12, 132),
    VALUES (135, 'root.39.46.132', 14, 13, 132),
    VALUES (136, 'root.39.46', 14, 14, 46),
    VALUES (657, 'root.39.46.132', 14, 15, 136),
    VALUES (142, 'root', 14, 16, null),
    VALUES (143, 'root.142', 14, 17, 142),
    VALUES (178, 'root.142.143', 14, 18, 143),
    VALUES (146, 'root.142.143', 14, 19, 143),
    VALUES (147, 'root.142.143', 14, 20, 143),
    VALUES (42, 'root', 14, 21, null),
    VALUES (43, 'root.42', 14, 22, 42),
    VALUES (45, 'root.42.43',  14, 23, 43),
    VALUES (671, 'root.42.43.45', 14, 24, 45),
    VALUES (672, 'root.42.43.45.671', 14, 25, 671)
;
INSERT INTO tows_contract (tow_id, cost, contract_id)
    VALUES (40, 10, 10),
    VALUES (131, 10, 10),
    VALUES (41, 10, 10),
    VALUES (134, 10, 10),
    VALUES (49, 10, 10),
    VALUES (125, 10, 10),
    VALUES (133, 10, 10),
    VALUES (135, 10, 10),
    VALUES (657, 10, 10),
    VALUES (178, 10, 10),
    VALUES (146, 10, 10),
    VALUES (147, 10, 10),
    VALUES (672, 10, 10)
;

как вариант, нужно просуммировать cost всех следующих строк, при этом эти строки имеют большее значение depth, чем текущая

Что в types_of_work? Пожалуйста, опубликуйте минимальный воспроизводимый пример: stackoverflow.com/help/minimal-reproducible-example.

Dogbert 24.07.2024 16:59

Я добавил код @Dogbert

dutik 24.07.2024 18:35

Хотя это воспроизводимый пример, он не является минимальным. Количество полезных ответов на сообщение обычно обратно пропорционально размеру примера (исключая случаи отсутствия или неадекватности примеров). Включайте только столько образцов данных и примеров выходных данных, сколько необходимо для четкой демонстрации желаемого поведения.

JohnH 24.07.2024 19:18

Мне просто нужно понять куда смотреть, исключения и ошибки буду обходить сам

dutik 24.07.2024 19:36

Код содержит множество ошибок. Для parent_id не существует типа, а синтаксис root.xyz недействителен.

Dogbert 24.07.2024 19:53

исправлены ошибки. Добавлен тип данных для parent_id и кавычки для root.xyz.

dutik 24.07.2024 20:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Присоедините таблицу обратно к самой себе с помощью оператора-предка LTREE, <@

with costs as (
  select t.*, c.cost, c.contract_id, t.path||t.tow_id::text as fullpath
    from types_of_work t
         left join tows_contract c on c.tow_id = t.tow_id
)
select l.*, sum(r.cost) as cumulative_cost
  from costs l
       join costs r on r.fullpath <@ l.fullpath
 group by l.tow_id, l.path, l.fullpath, l.project_id, l.lvl, l.parent_id, 
          l.cost, l.contract_id
 order by l.path;

Рабочая рабочий пример

Большое спасибо! Вы помогли мне разобраться! 1. Я изменил функцию генерации на path, чтобы она приняла форму вашего примера fullpath 2. С помощью JOIN я нашел сумму, как в вашем примере

dutik 25.07.2024 11:00

Другие вопросы по теме