Oracle
 sql >> база данни >  >> RDS >> Oracle

транспониране на колона в ред оракул

В чист SQL , ще се нуждае от много кодиране, защото ще трябва ръчно да поставите обхвата тъй като изобщо няма връзка между стойностите и диапазона. Ако имаше връзка, можете да използвате CASE изразяване и изграждане на диапазонадинамично .

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

От Oracle база данни 11g издание 1 и по-горе можете да използвате 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

По-горе, във вашия случай трябва да замените С клауза със съществуващата ви заявка като подзаявка . Трябва да включите други колони в UNION .

В PL/SQL , можете да (зло)използвате ИЗПЪЛНЕНИЕ НЕЗАБАВНО и вземете "обхвата", като извлечете имената на колони в динамичен sql .

Въпреки това би било много по-добре да промените/пренапишете съществуващата си заявка, която все още не сте показали.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. session/entitymanager е затворен

  2. Как да разберете дали дадена стойност съществува в рамките на VARRAY

  3. База данни:Конвейерни функции

  4. Може ли Oracle TDE да защити данните от DBA?

  5. В MySQL има ли функция като level в Oracle