Try it like this:
SELECT ID, A_NAME, MAX(LIST_OF_PRODUCTS) "LIST_OF_PRODUCTS", MAX(LIST_OF_SERVICES) "LIST_OF_SERVICES"
FROM
(
SELECT DISTINCT
ID, A_NAME,
LISTAGG(CASE WHEN P_ID_RN = 1 THEN PRODUCT_ID END, ', ') WITHIN GROUP (Order By PRODUCT_ID) OVER(Partition By ID) "LIST_OF_PRODUCTS",
LISTAGG(CASE WHEN S_ID_RN = 1 THEN SERVICE_ID END, ', ') WITHIN GROUP (Order By SERVICE_ID) OVER(Partition By ID) "LIST_OF_SERVICES"
FROM
( SELECT
a.ID, a.A_NAME,
b.PRODUCT_ID,
ROW_NUMBER() OVER(Partition By a.ID, b.PRODUCT_ID Order By PRODUCT_ID) "P_ID_RN",
b.SERVICE_ID,
ROW_NUMBER() OVER(Partition By a.ID, b.PRODUCT_ID, b.SERVICE_ID Order By b.PRODUCT_ID) "S_ID_RN"
FROM tbl_a a
LEFT JOIN tbl_b b ON (a.ID = b.ID)
)
)
WHERE LIST_OF_PRODUCTS Is Not Null OR LIST_OF_SERVICES Is Not Null
GROUP BY ID, A_NAME
ORDER BY ID
... which with sample data as below ...
WITH
tbl_a AS
(
Select 1001 "ID", 'Name 1' "A_NAME" From Dual Union All
Select 1002 "ID", 'Name 2' "A_NAME" From Dual Union All
Select 1003 "ID", 'Name 3' "A_NAME" From Dual Union All
Select 1004 "ID", 'Name 4' "A_NAME" From Dual
),
tbl_b AS
(
Select 1001 "ID", 'P_1' "PRODUCT_ID", 'S_1' "SERVICE_ID" From Dual Union All
Select 1001 "ID", 'P_1' "PRODUCT_ID", 'S_2' "SERVICE_ID" From Dual Union All
Select 1001 "ID", 'P_1' "PRODUCT_ID", 'S_5' "SERVICE_ID" From Dual Union All
Select 1002 "ID", 'P_4' "PRODUCT_ID", 'S_1' "SERVICE_ID" From Dual Union All
Select 1002 "ID", 'P_4' "PRODUCT_ID", 'S_3' "SERVICE_ID" From Dual Union All
Select 1003 "ID", 'P_2' "PRODUCT_ID", 'S_1' "SERVICE_ID" From Dual Union All
Select 1003 "ID", 'P_3' "PRODUCT_ID", 'S_2' "SERVICE_ID" From Dual Union All
Select 1004 "ID", 'P_1' "PRODUCT_ID", 'S_2' "SERVICE_ID" From Dual
)
... results:
ID |
A_NAME |
LIST_OF_PRODUCTS |
LIST_OF_SERVICES |
1001 |
Name 1 |
P_1 |
S_1, S_2, S_5 |
1002 |
Name 2 |
P_4 |
S_1, S_3 |
1003 |
Name 3 |
P_2, P_3 |
S_1, S_2 |
1004 |
Name 4 |
P_1 |
S_2 |