2012-01-17 90 views
1

我有2代表这是账户TBL和客户TBL,结构如下图所示:ORACLE SQL查询与亲子结构

帐户TBL

Customer_ID Account_ID Parent_Account_ID  
3780952  3780952  3780952 
3780997  3780997  3780997 
3781004  3781004  3780997  

客户TBL(Customer_Group有不同的价值,但我只对个人有兴趣)

Customer_ID  Customer_Group 
3781004   Personal 
3780997   Personal 
3780952   Personal  

规则d etermine PS/NonPS,原则,增刊按如下:

**PS/NonPs** 
Customer_ID equal to Parent_Account and Parent_Account is unique (not exist more than 1) then NonPs. 
Customer_ID equal to Parent_Account and Parent_Account is non unique OR - Customer_ID is not equal to Parent_Account then PS  
**Principle** 
IF NonPS then Principle is Null 
IF PS - If Customer_ID equal to Parent_Account then Principle is Y else N 
**Supp** 
IF NonPS then Supp is Null 
IF PS - If Customer_ID not equal to Parent_Account then supp is Y else N 

最终的输出应该是这样的

Customer_ID Account_ID Parent_Account_ID PS/NonPS Principle Supp 
3780952  3780952  3780952    NonPS  Null  Null 
3780997  3780997  3780997    PS   Y   N 
3781004  3781004  3780997    PS   N   Y 

我alredy试过很多次,但不能仍然获得output..anyone能帮忙吗?

回答

2

随着CASEanalytic functions

SQL> WITH myData AS (
    2 SELECT 3780952 Customer_ID, 3780952 Account_ID, 3780952 Parent_Account_ID 
    3  FROM DUAL 
    4 UNION ALL SELECT 3780997, 3780997, 3780997 FROM DUAL 
    5 UNION ALL SELECT 3781004, 3781004, 3780997 FROM DUAL 
    6 ) 
    7 SELECT v.*, 
    8   CASE WHEN ps = 'PS' AND customer_id = parent_account_id THEN 'Y' 
    9    WHEN ps = 'PS' THEN 'N' 
10   END "Principle", 
11   CASE WHEN ps = 'PS' AND customer_id != parent_account_id THEN 'Y' 
12    WHEN ps = 'PS' THEN 'N' 
13   END "Supp" 
14 FROM (SELECT m.*, 
15     CASE WHEN customer_id = parent_account_id 
16      AND COUNT(*) OVER (PARTITION BY parent_account_id) = 1 
17      THEN 'NonPS' 
18      ELSE 'PS' 
19     END ps 
20   FROM myData m) v; 

CUSTOMER_ID ACCOUNT_ID PARENT_ACCOUNT_ID PS P S 
----------- ---------- ----------------- ----- - - 
    3780952 3780952   3780952 NonPS 
    3781004 3781004   3780997 PS N Y 
    3780997 3780997   3780997 PS Y N 
+0

+1我在做,而你正在做的:P – 2012-01-17 11:20:20

+0

有助于me..thanks很多 – user871695 2012-01-18 02:23:19

2

你可以这样说:

select a.Customer_ID, a.Account_ID, a.Parent_Account_ID, 
b.PS as 'PS/NonPS', 
case when (b.PS = 'NonPs') then NULL else 
    (case when (a.Customer_ID = a.Parent_Account_ID) then 'Y' else 'N' end) 
end as 'Principle', 
case when (b.PS = 'NonPs') then NULL else 
    (case when (a.Customer_ID = a.Parent_Account_ID) then 'N' else 'Y' end) 
end as 'supp' 

from Account a 
inner join (
select a.Customer_ID, a.Account_ID, a.Parent_Account_ID, 
case when (a.Customer_ID = a.Parent_Account_ID) 
    and (select count(ax.Account_Id) from Account ax where ax.Parent_Account_ID = a.Parent_Account_ID) = 1 
    then 'NonPS' 
    else 'Ps' 
end as 'PS' 
from Account a) b on a.Customer_ID = b.Customer_ID and a.Account_ID = b.Account_ID and a.Parent_Account_ID = b.Parent_Account_ID