In pure SQL , het heeft veel codering nodig omdat je het bereik handmatig moet plaatsen omdat er helemaal geen relatie is tussen de waarden en het bereik. Als er een relatie was geweest, zou je CASE . kunnen gebruiken expressie en bouw het bereik dynamisch .
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
Van Oracle-database 11g Release 1 en hoger, zou u UNPIVOT . kunnen gebruiken
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
Hierboven moet je in jouw geval de MET . vervangen clausule met uw bestaande zoekopdracht als een subquery . U moet andere kolommen opnemen in de UNION .
In PL/SQL , zou je IMMEDIATE UITVOEREN kunnen (ab)gebruiken en verkrijg het "bereik" door de kolomnamen te extraheren in dynamische sql .
Hoewel het veel beter zou zijn om uw bestaande zoekopdracht, die u nog niet heeft getoond, aan te passen/herschrijven.