数据与分析函数的层次关系

时间:2012-02-14 08:44:23

标签: 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 - 我的子PR帐户的数量,不包括在内。
  • Total_PR - 整体结构中的PR帐户总数
  • My_Total_NPR - 我的孩子NPR帐户的数量,不包括自己。
  • Total_NPR - 整体结构中的NPR帐户总数

PR 代表付款责任,例如,负责帐户158的付款是158(Paying_Account_ID),因此158的Total_PR是3(158,159) ,160)
NPR 代表非付款责任,例如,负责帐户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

1 个答案:

答案 0 :(得分:0)

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

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

尝试编写一个查询,该查询会查询特定问题(例如,我的子公关帐户的数量,其中不包含自身)。毫无疑问,这个查询将包含像“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;