Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Orakel von Spalte zu Zeile transponieren

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.