sql >> Database >  >> RDS >> Oracle

transponeer kolom naar rij orakel

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.



  1. Wat is het equivalent van SQL Server APPLY in Oracle?

  2. Meerdere polygonen tekenen op Google Maps API v3 vanuit MySQL-database

  3. ORA-01036:naam/nummer van ongeldige variabele tijdens aanroepen van opgeslagen functie

  4. Is het een goed idee om het datetime-veld in mysql te indexeren?