In reinem SQL , wird viel Codierung benötigt, da Sie den Bereich manuell setzen müssen da es überhaupt keinen Zusammenhang zwischen den Werten und der Reichweite gibt. Wenn es eine Beziehung gegeben hätte, könnten Sie CASE verwenden Ausdruck und bauen Sie den Bereich dynamisch auf .
SQL> WITH DATA AS
2 (SELECT 50 "1-99transval",
3 90 "100-200transval",
4 80 "200-300transval",
5 67 "1-99nontransval",
6 58 "100-200nontransval",
7 88 "200-300nontransval"
8 FROM dual
9 )
10 SELECT '1-99' range,
11 "1-99transval" transval,
12 "1-99nontransval" nontransval
13 FROM DATA
14 UNION
15 SELECT '100-200' range,
16 "100-200transval",
17 "100-200nontransval" nontransval
18 FROM DATA
19 UNION
20 SELECT '200-300' range,
21 "200-300transval",
22 "200-300nontransval" nontransval
23 FROM DATA;
RANGE TRANSVAL NONTRANSVAL
------- ---------- -----------
1-99 50 67
100-200 90 58
200-300 80 88
Ab Oracle-Datenbank 11g Release 1 und höher könnten Sie UNPIVOT verwenden
SQL> WITH DATA AS
2 (SELECT 50 "1-99transval",
3 90 "100-200transval",
4 80 "200-300transval",
5 67 "1-99nontransval",
6 58 "100-200nontransval",
7 88 "200-300nontransval"
8 FROM dual
9 )
10 SELECT *
11 FROM DATA
12 UNPIVOT( (transval,nontransval)
13 FOR RANGE IN ( ("1-99transval","1-99nontransval") AS '1-99'
14 ,("100-200transval","100-200nontransval") AS '100-200'
15 ,("200-300transval","200-300nontransval") AS '200-300'));
RANGE TRANSVAL NONTRANSVAL
------- ---------- -----------
1-99 50 67
100-200 90 58
200-300 80 88
Oben müssen Sie in Ihrem Fall das WITH ersetzen -Klausel mit Ihrer bestehenden Abfrage als Unterabfrage . Sie müssen andere Spalten in die UNION aufnehmen .
In PL/SQL , könnten Sie IMMEDIATE AUSFÜHREN (missbrauchen). und erhalten Sie den "Bereich", indem Sie die Spaltennamen extrahieren in dynamischem SQL .
Es wäre jedoch viel besser, Ihre vorhandene Abfrage, die Sie noch nicht gezeigt haben, zu ändern/umzuschreiben.