Un modo per differenziare tra valte
valori possono essere controllare se la stringa contiene solo cifre o meno (soluzione povera, ma dovrebbe funzionare):
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
uscita:
╔═══════════╦═══════════════╦═══════════════╦═════════════╗
║ VREC ║ MAX(CASE...) ║ MAX(CASE...) ║ MAX(VALNUM) ║
╠═══════════╬═══════════════╬═══════════════╬═════════════╣
║ 98945823 ║ 06001 ║ Total ║ 16.57 ║
║ 98945824 ║ 06005 ║ Total ║ 0.36 ║
╚═══════════╩═══════════════╩═══════════════╩═════════════╝
Per la tua cas e lo scambio CTE valori hardcoded con:
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);
tua struttura dei dati è molto povero, quindi questa soluzione è solo soluzione. Dovresti davvero cambiare la struttura sottostante.
@ dang ... ci sono state una serie di domande da voi da ieri.Dovresti impegnarti a risolverli. –
Possibile duplicato di [Come posso ottenere i nomi delle colonne da una tabella in Oracle?] (Http://stackoverflow.com/questions/452464/how-can-i-get-column-names-from-a-table-in -oracolo) –
Principalmente, i progetti di DB inefficienti rendono questo tipo di complessità. –