Объединение связанных записей организации в SQL, где между организациями существуют отношения между родителями и детьми - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь создать таблицу данных для использования в отчетах Yellowfin BI. Одним из ограничений является то, что никакие временные таблицы не могут быть созданы и затем удалены в базе данных. Я извлекаю данные из существующей базы данных, которую я не могу контролировать. Я могу использовать только SQL для запроса существующих данных.

В исходной базе данных есть две таблицы, с которыми мне нужно работать. Я упростил их для ясности. Первый содержит организации. Он имеет столбец ORG_ID, который содержит уникальный идентификатор для каждой организации и столбец PARENT_ORG_ID, указывающий, какая организация является родительской компанией для других в списке:

ORG_ID     PARENT_ORG_ID
1          Null
2          1
3          5
4          5
5          Null
6          1

Используя приведенную выше таблицу, я вижу, что есть следующие отношения между организациями:

ORG_ID     RELATED_ORGANISATIONS
1          2 and 6
2          1 and 6
3          5 and 4
4          5 and 3
5          4 and 3
6          1 and 2

Я не уверен, что лучший способ представить эти соединения в запросе, так как мне нужно использовать эти отношения со второй таблицей.

Вторая таблица У меня есть список организаций и причитающихся денег:

ORG_ID     MONEY_OWED
1          5
2          10
3          0
4          15
5          20
6          5

Мне нужно получить таблицу, в которой я могу найти любой ORG_ID и просмотреть объединенные данные для этой Организации и всех связанных с ней организаций. В моем примере это может быть таблица результатов, например, такая:

ORG_ID     MONEY_OWED_BY_ALL_RELATED_ORGS
1          20
2          20
3          35
4          35
5          35
6          20

Я думаю, что мне следует использовать CTE для управления отношениями между организациями, но я не могу разобраться в этом. Это.

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 25 февраля 2020

Для вашего конкретного примера вы можете использовать:

select o.*,
       sum(mo.money_owed) over (partition by coalesce(o.parent_org_id, o.org_id)) as parent_owed
from organizations o left join
     money_owed mo
     on mo.org_id = o.org_id;

Это работает, потому что ваши организации имеют только один уровень глубины - что соответствует вашим образцам данных.

...