I have two tables which share one-to-many relationship. MY_FACT is the parent table whereas MY_RMDETAILS is the child table having multiple records for a single parent record.
Table MY_FACT:
| FACT_ID | FACT_DATE | TOTAL_DEMAND |
|---|---|---|
| 1000 | 21/04/2022 | 500 |
| 2000 | 21/04/2022 | 500 |
Table MY_RMDETAILS:
| RM_ID | FACT_ID | PROMISE_QTY | REQUEST_QTY | RM_ITEM_NAME |
|---|---|---|---|---|
| 200 | 1000 | 500 | 500 | RM1 |
| 201 | 1000 | 400 | 500 | RM2 |
| 202 | 1000 | 500 | 500 | RM3 |
| 203 | 1000 | 400 | 500 | RM4 |
| 300 | 2000 | 500 | 500 | RM1 |
| 301 | 2000 | 500 | 500 | RM2 |
| 302 | 2000 | 500 | 500 | RM3 |
| 303 | 2000 | 500 | 500 | RM4 |
I need to write a query to have below output.
Logic:
If MY_RMDETAILS.PROMISE_QTY is less than MY_RMDETAILS.REQUEST_QTY, the supply is insufficient.
So for any given MY_FACT record, if any one of its children records from MY_RMDETAILS has PROMISE_QTY less than REQUEST_QTY, the flag SUPPLY_SUFFICIENT in output should be N else it should be Y.
And INSUFFICIENT_RMs column in output should show the MY_RMDETAILS.RM_ITEM_NAME of "insufficient" records as comma separated format.
EXPECTED OUTPUT:
| FACT_ID | FACT_DATE | TOTAL_DEMAND | SUPPLY_SUFFICIENT? | INSUFFICIENT_RMs |
|---|---|---|---|---|
| 1000 | 21/04/2022 | 500 | N | RM2,RM4 |
| 2000 | 21/04/2022 | 500 | Y |
Please help. Thanks in advance.
CodePudding user response:
You can try to use subquery with condition aggregate function.
SELECT t2.*,
CASE WHEN t1.INSUFFICIENT_cnt > 0 THEN 'N' ELSE 'Y' END,
t1.INSUFFICIENT_RMs
FROM (
SELECT FACT_ID,
LISTAGG(CASE WHEN PROMISE_QTY < REQUEST_QTY THEN RM_ITEM_NAME END, ', ') WITHIN GROUP (ORDER BY RM_ID) INSUFFICIENT_RMs,
COUNT(CASE WHEN PROMISE_QTY < REQUEST_QTY THEN RM_ITEM_NAME END) INSUFFICIENT_cnt
FROM MY_RMDETAILS
GROUP BY FACT_ID
) t1 INNER JOIN MY_FACT t2
ON t1.FACT_ID = t2.FACT_ID
