sql >> Databáze >  >> RDS >> Oracle

transponovat sloupec do řádku oracle

V čistém SQL , bude vyžadovat hodně kódování, protože rozsah budete muset zadat ručně protože mezi hodnotami a rozsahem není vůbec žádný vztah. Pokud by existoval vztah, můžete použít CASE výraz a sestavte rozsah dynamicky .

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

Z databáze Oracle 11g Release 1 a výše, můžete použít UNPIVOT

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

Výše je ve vašem případě potřeba nahradit WITH klauzule s vaším stávajícím dotazem jako poddotaz . Do UNION musíte zahrnout další sloupce .

V PL/SQL , můžete (ne)použít EXECUTE IMMEDIATE a získat "rozsah" extrahováním názvů sloupců v dynamickém SQL .

I když by bylo mnohem lepší upravit/přepsat váš stávající dotaz, který jste ještě nezobrazili.



  1. mysql vypočítá sekundy mezi dvěma daty/časy pro každý den

  2. Chyba:ORA-06553:PLS-306:nesprávný počet nebo typy argumentů ve volání procedury

  3. Jak provést ladění sql v Oracle

  4. Odstranění z tabulky MySQL s omezením cizího klíče