One way to distinguish between valte values ββis to check if a string contains only digits or not (a bad solution, but should work):
WITH cte( vrec,valnum, valte) AS ( SELECT 98945823 AS vrec, NULL AS valnum,'Total' AS valte FROM dual UNION ALL SELECT 98945823, NULL, '06001' FROM dual UNION ALL SELECT 98945823, 16.57, NULL FROM dual UNION ALL SELECT 98945824, NULL, 'Total' FROM dual UNION ALL SELECT 98945824, NULL, '06005' FROM dual UNION ALL SELECT 98945824, 0.36, NULL FROM dual ) SELECT vrec ,MAX(CASE WHEN REGEXP_LIKE(valte, '^[[:digit:]]*$') THEN valte ELSE NULL END) ,MAX(CASE WHEN NOT REGEXP_LIKE(valte, '^[[:digit:]]*$') THEN valte ELSE NULL END) ,MAX(valnum) FROM cte GROUP BY vrec;
SqlFiddleDemo
Output:
βββββββββββββ¦ββββββββββββββββ¦ββββββββββββββββ¦ββββββββββββββ β VREC β MAX(CASE...) β MAX(CASE...) β MAX(VALNUM) β β ββββββββββββ¬ββββββββββββββββ¬ββββββββββββββββ¬ββββββββββββββ£ β 98945823 β 06001 β Total β 16.57 β β 98945824 β 06005 β Total β 0.36 β βββββββββββββ©ββββββββββββββββ©ββββββββββββββββ©ββββββββββββββ
For your case, exchange cte with hardcoded values ββusing:
select vrec, valnum, valte from val_tb where recd in (select recd from rectb where setd = 17) AND (vid = 3 OR vid = 26 OR vid = 28);
Your data structure is very bad, so this solution just gets around. You must really change the basic structure.
source share