sql - 具有分析功能的数据的层次关系

标签 sql database oracle

这个问题和我之前的帖子有关,原表如下

Customer_ID   Account_ID     Paying_Account_ID    Parent_Account_ID    Company_ID
 158            158             158                  158                     0
 159            159             158                  158                     0
 160            160             158                  158                     0
 181            181             181                  181                     0
 183            183             183                  183                     0
 24669          24669           24669                24669                   0         
 24671          24671           24671                24669                   0
 24670          24670           24670                24669                   0     
 3385127        3385127         3385127              24670                   0

为了识别数据的层次关系,它们是 PARENT_ACCOUNT_IDACCOUNT_ID,下面是我使用的查询。

SELECT lpad(' ', 2*level) || A.ACCOUNT_ID AS LEVEL_LABEL,
       CONNECT_BY_ISCYCLE "Cycle",
       LEVEL,
       A.*
FROM   ACCOUNT A
START WITH parent_account_id = account_id
CONNECT BY NOCYCLE PRIOR A.ACCOUNT_ID = A.PARENT_ACCOUNT_ID AND
        account_id <> parent_account_id;

这是查询的结果

Level_Label Level CustomerID AccountID Paying_AccountID Parent_AccountID CompanyID
  158          1       158        158           158          158             0
    159        2       159        159           158          158             0
    160        2       160        160           158          158             0
  181          1       181        181           181          181             0
  183          1       183        183           183          183             0
  24669        1       24669      24669         24669        24669           0       
    24671      2       24671      24671         24671        24669           0
    24670      2       24670      24670         24670        24669           0         
     3385127   3       3385127    3385127       3385127      3385127         0  

我的问题是如何修改查询以计算以下值:

  • My_Total_PR - 我的 child PR 帐户的数量,不包括它自己。
  • Total_PR - 整体结构中PR账户总数
  • My_Total_NPR - 我的 child NPR 帐户的数量,不包括它自己。
  • Total_NPR——整体结构中NPR账户总数

PR代表Payment Responsible,例如Account 158负责的payment是158(Paying_Account_ID),所以Total_PR为158是 3 (158, 159, 160)
NPR 代表 Non Payment Responsible,例如 Account 159 的付款责任是 158 (Paying_Account_ID),所以 159 的 Total_NPR 是 1。

这是预期的结果,任何建议将不胜感激。谢谢!

Level_Label Level Cycle My_Total_PR Total_PR  My_Total_NPR Total_NPR Paying_Account
 158          1      0       2         3          0              0        158
   159        2      0       0         0          0              1        158
   160        2      0       0         0          0              1        158
 181          1      0       0         1          0              0        181
 183          1      0       0         1          0              0        183
 24669        1      0       0         1          3              3        24669  
   24671      2      0       0         1          0              0        24671
   24670      2      0       0         1          1              1        24670
    3385127   3      0       0         1          0              0        3385127

最佳答案

“总计”查询在您的查询中没有 IMO 的位置​​,因为它们不是特定于帐户的。我不会尝试将它们压缩到您的查询中,而是为它们编写单独的查询。

但是,“我的”查询特定于一个帐户(或 customer_id ?)。我的一般方法如下:

尝试编写一个查询来回答单个给定帐户的特定问题(例如,我的 child PR 帐户的数量不包括它自己)。毫无疑问,此查询将包含类似“and account_id = 158”的子句。

然后你可以做两件事:

要么删除该子句并确保公开 account_id。该查询随后将回答您针对所有 帐户的问题。然后您可以将此选择与您的分层查询一起加入

select ...
from 
    (treeQuery) t,
    (myQuery) m
where
    t.account_id = m.account_id;

或者,由于“我的”查询仅返回一个值,您可以在投影中使用它们。如

select
    (select myQuery where account_id = t.account_id) alias1,
     t.* -- or whatever columns you want to see
from
    treeQuery t;

关于sql - 具有分析功能的数据的层次关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9273912/

相关文章:

php - 如何从 Laravel 中的 SQL 注入(inject)中保护此 sql 查询?

php - 在错误消息后保留寄存器详细信息以防止重新输入数据

sql - SP2-0734 : unknown command beginning select

oracle - 使用 ColdFusion 11/Oracle 12c 生成 Hibernate 配置时出错

sql-server - SQL Server 2008 R2 是 Oracle 11g RAC 的替代品吗?

java - JDBC 使用 where 条件在 resultSet 中返回 null 值。我尝试获取所有列,但它没有返回任何值

c# - NHibernate 动态创建/更改/删除表

mysql - 追踪系统数据库结构

java - 使用 Jackcess 从 Access 表中删除特定行

java - JTable:选择一行时从数据库中获取值