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

Dynamiczny obrót w Oracle sql

Nie można umieścić dynamicznej instrukcji w instrukcji PIVOT's IN bez użycia PIVOT XML, który generuje mniej niż pożądane dane wyjściowe. Możesz jednak utworzyć ciąg IN i wprowadzić go do swojego wyciągu.

Po pierwsze, oto moja przykładowa tabela;

  myNumber    myValue myLetter
---------- ---------- --------
         1          2 A        
         1          4 B        
         2          6 C        
         2          8 A        
         2         10 B        
         3         12 C        
         3         14 A      

Najpierw skonfiguruj ciąg znaków, który będzie używany w instrukcji IN. Tutaj umieszczasz ciąg w "str_in_statement". Do konfiguracji ciągu używamy COLUMN NEW_VALUE i LISTAGG.

clear columns
COLUMN temp_in_statement new_value str_in_statement
SELECT DISTINCT 
    LISTAGG('''' || myLetter || ''' AS ' || myLetter,',')
        WITHIN GROUP (ORDER BY myLetter) AS temp_in_statement 
    FROM (SELECT DISTINCT myLetter FROM myTable);

Twój ciąg będzie wyglądał następująco:

'A' AS A,'B' AS B,'C' AS C

Teraz użyj wyrażenia String w zapytaniu PIVOT.

SELECT * FROM 
    (SELECT myNumber, myLetter, myValue FROM myTable)
    PIVOT (Sum(myValue) AS val FOR myLetter IN (&str_in_statement));

Oto wynik:

  MYNUMBER      A_VAL      B_VAL      C_VAL
---------- ---------- ---------- ----------
         1          2          4            
         2          8         10          6 
         3         14                    12 

Istnieją jednak ograniczenia. Możesz łączyć tylko ciąg do 4000 bajtów.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. funkcja listunagg?

  2. Oracle:jaka jest sytuacja, aby użyć RAISE_APPLICATION_ERROR?

  3. Znajdź wszystkie wartości nieliczbowe w kolumnie w Oracle

  4. Funkcja POWER() w Oracle

  5. Indeksy Oracle i rodzaje indeksów w Oracle z przykładem