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

Oracle обръща редове към колони

Една опция би била използването на PIVOT Клауза

SELECT *
  FROM (SELECT t1.*, t2.tipo, t2.valor 
          FROM table1 t1 
          JOIN table2 t2 
            ON t2.id = t1.id)
 PIVOT 
 (
  MAX(valor) FOR tipo IN ( 't1' AS "t1", 't2' AS "t2", 't3' AS "t3" )
 )  

но това е статично, напр. трябва да се актуализира като различни стойности за tipo се добавя колона. За да го направите динамичен, можете да създадете функция

CREATE OR REPLACE FUNCTION Get_Pivoted_Cols RETURN SYS_REFCURSOR IS
  v_recordset SYS_REFCURSOR;
  v_sql       VARCHAR2(32767); 
  v_cols      VARCHAR2(32767);      
BEGIN
  SELECT LISTAGG( ''''||tipo||''' AS "'||tipo||'"' , ',' )
          WITHIN GROUP ( ORDER BY tipo )  
    INTO v_cols
    FROM ( SELECT DISTINCT tipo FROM table2 );

  v_sql := 'SELECT *
              FROM (SELECT t1.*, t2.tipo, t2.valor 
                      FROM table1 t1 
                      JOIN table2 t2 
                        ON t2.id = t1.id)
             PIVOT 
             (
              MAX(valor) FOR tipo IN ( '|| v_cols ||' )
             )';   

  OPEN v_recordset FOR v_sql;
  RETURN v_recordset;
END;
/

и след това се обадете с помощта на

VAR rc REFCURSOR
EXEC :rc := Get_Pivoted_Cols;
PRINT rc

от конзолата за разработчици на 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. RODBC заявката не връща данни

  2. Дължина на съхранение на BLOB в Oracle

  3. Как да видите всички метаданни на колони на таблица в база данни на oracle?

  4. JCombobox не се показва

  5. ORA-04021:възникна изчакване при изчакване за заключване на обекта