Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Oracle przestawiaj wiersze na kolumny

Jedną z opcji byłoby użycie PIVOT Klauzula

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" )
 )  

ale to jest statyczne, np. należy zaktualizować jako różne wartości dla tipo zostanie dodana kolumna. Aby była dynamiczna, możesz utworzyć funkcję

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;
/

a następnie zadzwoń za pomocą

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

z konsoli programisty SQL.

Demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zamienić kolumnę na rzędy w Oracle 10g

  2. Wywołanie funkcji pl/sql z mybatis 3

  3. Dodaj wskaźnik porządkowy do daty w Oracle

  4. błąd:ORA-65096:nieprawidłowa nazwa wspólnego użytkownika lub roli w oracle

  5. Usuń zduplikowane wiersze w Oracle SQL, pozostawiając najnowsze wpisy