Czy następujące zapytanie daje te same wyniki?
SELECT c.role_id
, c.subgroup
, c.subgroup_description
, COUNT(a.USER_ID) user_count
FROM cmp_role c
LEFT OUTER JOIN (
SELECT r.user_id
, r.role_id
FROM (
SELECT r.user_id
, r.role_id
, r.participant_code
, MAX(r.status_id)
FROM user_role r
INNER JOIN cmp_role c ON c.role_id = r.role_id
WHERE r.participant_code IS NOT NULL
AND c.group_id = 3
GROUP BY
r.user_id
, r.role_id
, r.participant_code
HAVING MAX(r.status_id) IN (
SELECT status_id
FROM user_role
WHERE (Active = 1
OR (Active IN ( 0,3 )
AND SYSDATE BETWEEN effective_from_date AND effective_to_date)
)
)
) r
INNER JOIN user e ON e.user_id = RTRIM(r.user_id)
) a ON a.role_id = c.role_id
WHERE c.group_id = 3
GROUP BY
c.role_id
, c.subgroup
, c.subgroup_description
ORDER BY
c.subgroup
Łatwiej jest czytać (dla mnie). Jeśli daje takie same wyniki, możesz już zacząć od porzucenia r.participant_code
i MAX(r.status_id)
z wewnętrznego wyboru.