【问题标题】:Combining related organisation records in SQL where there is a Parent-Child relationship between organisations在组织之间存在父子关系的 SQL 中组合相关组织记录
【发布时间】:2020-02-25 11:58:45
【问题描述】:

我正在尝试构建一个用于 Yellowfin BI 报告的数据表。这样做的一个限制是不能在数据库中创建和删除临时表。我正在从现有数据库中提取数据,我无法控制。我只能使用SQL查询现有数据。

我需要使用源数据库中的两个表。为了清楚起见,我已经简化了它们。第一个包含组织。它有一个 ORG_ID 列,其中包含每个组织的唯一 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 来处理组织之间的关系,但我无法理解它。

任何帮助将不胜感激!

【问题讨论】:

  • 你的层次结构可以超过一个深度吗?
  • @GordonLinoff 层次结构的深度可能超过一级。他们目前还没有,但如果能找到一个有弹性的解决方案来解决这个问题,那就太好了。

标签: sql sql-server-2012


【解决方案1】:

对于您的特定示例,您可以使用:

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;

之所以有效,是因为您的组织只有一层深度——这与您的示例数据一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多