I have a complex sql need to solve, the idea is to determine the ADMIN_ID for a particular CUSTOMER_ID. The rule to determine the ADMIN_ID is as below:
-
To determine the ADMIN_ID for a particular account, the system should query the
account from bottom up to the parent, and the first account with TXT01 is not null
it the parent. -
The ADMIN_ID is only applicable to CUSTOMER Group E.
-
In case Top account have an absence of a TXT01, it should give a warning message
-
Only CUSTOMER_ID = PAYING_ACCOUNT_ID need to analyze
Account Table
CUSTOMER_ID PAYING_ACCOUNT_ID PARENT_ACCOUNT_ID
3271516 3271516 719216
1819276 1819276 810546
719216 719216 719216
810546 810546 810547
810547 810547 810547
999999 111111 111111
111111 111111 111111
123456 123456 231
231 231 231
Customer Table
CUSTOMER_ID TXT01
719216 TOM
810546 NULL
810547 JIM
3271516 NULL
1819276 NULL
999999 NULL
111111 BEN
123456 NULL
231 NULL
Customer Group
CUSTOMER_ID GROUP
719216 E
810546 E
810547 E
3271516 E
1819276 E
999999 E
111111 E
123456 E
231 E
888 A
Output
CUSTOMER_ID PAYING_ACCOUNT_ID PARENT_ACCOUNT_ID ADMIN_ID
3271516 3271516 719216 TOM
1819276 1819276 810546 JIM
719216 719216 719216 TOM
810546 810546 810547 JIM
810547 810547 810547 JIM
111111 111111 111111 BEN
123456 123456 231 Warning!!
231 231 532 Warning!!
DDL
CREATE TABLE ACCOUNT (CUSTOMER_ID NUMBER(20) NOT NULL,
PAYING_ACCOUNT_ID NUMBER(20),
PARENT_ACCOUNT_ID NUMBER(20));
CREATE TABLE CUSTOMER (CUSTOMER_ID NUMBER(20) NOT NULL,
TXT01 VARCHAR2(20));
CREATE TABLE CUSTOMER_GROUP (CUSTOMER_ID NUMBER(20) NOT NULL,
GROUP VARCHAR2(20));
INSERT INTO ACCOUNT VALUES (3271516,3271516,719216);
INSERT INTO ACCOUNT VALUES (1819276,1819276,810546);
INSERT INTO ACCOUNT VALUES (719216,719216,719216);
INSERT INTO ACCOUNT VALUES (810546,810546,810547);
INSERT INTO ACCOUNT VALUES (810547,810547,810547);
INSERT INTO ACCOUNT VALUES (999999,111111,111111);
INSERT INTO ACCOUNT VALUES (111111,111111,111111);
INSERT INTO ACCOUNT VALUES (123456,123456,231);
INSERT INTO ACCOUNT VALUES (231,231,231);
INSERT INTO CUSTOMER VALUES (719216,'TOM');
INSERT INTO CUSTOMER VALUES (810546,NULL);
INSERT INTO CUSTOMER VALUES (810547,'JIM');
INSERT INTO CUSTOMER VALUES (3271516,NULL);
INSERT INTO CUSTOMER VALUES (1819276,NULL);
INSERT INTO CUSTOMER VALUES (999999,NULL);
INSERT INTO CUSTOMER VALUES (111111,'BEN');
INSERT INTO CUSTOMER VALUES (123456,NULL);
INSERT INTO CUSTOMER VALUES (231,NULL);
INSERT INTO CUSTOMER_GROUP VALUES (719216,'E');
INSERT INTO CUSTOMER_GROUP VALUES (810546,E);
INSERT INTO CUSTOMER_GROUP VALUES (810547,'E');
INSERT INTO CUSTOMER_GROUP VALUES (3271516,'E');
INSERT INTO CUSTOMER_GROUP VALUES (1819276,'E');
INSERT INTO CUSTOMER_GROUP VALUES (999999,'E');
INSERT INTO CUSTOMER_GROUP VALUES (111111,'E');
INSERT INTO CUSTOMER_GROUP VALUES (123456,'E');
INSERT INTO CUSTOMER_GROUP VALUES (231,'E');
INSERT INTO CUSTOMER_GROUP VALUES (888,'A');
This is my code..still doing but stuck in some point. Appreciate guru here can gv me a hand
WITH myData AS (
SELECT CUSTOMER_ID, TXT01 FROM CUSTOMER WHERE CUSTOMER_ID IN
(SELECT CUSTOMER_ID from CUSTOMER_GROUP WHERE GROUP = 'E')
)
SELECT v.*
FROM
(SELECT m.* ,
CASE WHEN TXT01 IS NOT NULL THEN TXT01
ELSE ( *STUCK HERE*
END ADMIN_ID
FROM myData m) v
Try this
Here are my results: