Sql 数据与解析函数的层次关系
这个问题与我以前的帖子有关,原始表格如下Sql 数据与解析函数的层次关系,sql,database,oracle,Sql,Database,Oracle,这个问题与我以前的帖子有关,原始表格如下 Customer_ID Account_ID Paying_Account_ID Parent_Account_ID Company_ID 158 158 158 158 0 159 159 158 158
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
为了确定数据的层次关系,即父帐户ID
和帐户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;
我的问题是如何修改查询以计算以下各项的值:
- My_Total_PR-我的孩子的PR帐户数,不包括其本身
- Total_PR-总体结构中的PR账户总数
- My_Total_NPR-我孩子的NPR帐户数,不包括其本身李>
- 总NPR-总体结构中NPR账户的总数
Paying\u Account\u ID
),因此158的Total\u PR
是3(158,159,160)NPR代表非付款责任,例如,负责账户159的付款为158(
Paying\u Account\u ID
),因此159的Total\u 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
“总计”查询在您的查询中没有位置,因为它们不特定于某个帐户。我不会试图将它们压缩到您的查询中,而是为它们编写单独的查询
但是,“我的”查询是特定于帐户(或客户id?)的。我的一般做法如下:
试着为单个给定帐户编写一个询问特定问题的查询(例如,我孩子的公关帐户数量,不包括其本身)。毫无疑问,这个查询将包含一个类似“and account_id=158”的子句
然后你可以做两件事:
您可以删除此子句并确保帐户id已公开。然后,查询将为所有帐户回答您的问题。然后,您可以将此选择与分层查询连接起来,如中所示
select ...
from
(treeQuery) t,
(myQuery) m
where
t.account_id = m.account_id;
或者,由于“my”查询只返回一个值,因此可以在投影中使用它们。如
select
(select myQuery where account_id = t.account_id) alias1,
t.* -- or whatever columns you want to see
from
treeQuery t;
缺少上一个
帐户\u id
和父帐户\u id
之间的运算符。我想在前面的问题中是=代码>,但对我来说没有多大意义。你能确认一下你用的是什么接线员吗?我插入了=
.account\u id parent\u account\u id实际上可以忽略该account\u id parent\u account\u id。我手头没有Oracle实例,因此无法计算详细信息,但请查看分析函数。
select
(select myQuery where account_id = t.account_id) alias1,
t.* -- or whatever columns you want to see
from
treeQuery t;