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

Oracle SQL — dynamiczna instrukcja przypadku

Potrzebujesz funkcji PRZESTAWNE z definicją kolumn dynamicznych. Najprostszym sposobem jest pivot xml:

create table tst_data (id int primary key, source varchar2(255));

insert into tst_data values (1, 'INTERNET');
insert into tst_data values (2, 'DEMO');
insert into tst_data values (3, 'INTERNET');
insert into tst_data values (4, 'SALES');
insert into tst_data values (5, 'INTERNET');
insert into tst_data values (6, 'DEMO');
insert into tst_data values (7, 'INTERNET');
insert into tst_data values (8, 'COM');

commit;

select * from (
  select source from tst_data
) 
pivot xml 
(
  count(1)
  for source in (select distinct t.source from tst_data t)
)  

Po przetworzeniu danych XML:

<PivotSet>
    <item>
        <column name = "SOURCE">COM</column>
        <column name = "COUNT(1)">1</column>
    </item>
    <item>
        <column name = "SOURCE">DEMO</column>
        <column name = "COUNT(1)">2</column>
    </item>
    <item>
        <column name = "SOURCE">INTERNET</column>
        <column name = "COUNT(1)">4</column>
    </item>
    <item>
        <column name = "SOURCE">SALES</column>
        <column name = "COUNT(1)">1</column>
    </item>
</PivotSet>

PIVOT XML obsługuje definicję kolumn dynamicznych (for source in (select distinct t.source from tst_data t) ), jednak zwraca dane XML. Extractvalue i xmltable funkcje pozwalają odpytywać poszczególne kolumny z XML-a po stronie serwera, ale należy wcześniej określić nazwy pól. Więc zakładam, że analizuję to po stronie klienta.

Jeśli chcesz zrobić wszystko na warstwie DB, jest inne podejście. PIVOT (nie XML) wymaga nazw kolumn for source in ('INTERNET', 'DEMO', 'COM', ...) . Możliwe jest wygenerowanie takiego zapytania i zwrócenie kursora po stronie klienta:

CREATE OR REPLACE FUNCTION FUNCTION1 RETURN SYS_REFCURSOR AS 
 cur sys_refcursor;
BEGIN
  open cur for 'select * from dual'; // generate PIVOT query here
  RETURN cur;
END FUNCTION1;

Nie znam żadnej metody tworzenia prostego, niewpisanego zapytania z kursora (po stronie serwera), więc jeśli chcesz użyć zwykłego zapytania SQL, zrób to w dwóch krokach:

  1. Generuj zapytanie PIVOT z nazwanymi kolumnami w funkcji PL/SQL;
  2. Uruchom zapytanie od swojego klienta.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Rails3 nie może zapisać „ñ” w Oracle 11g

  2. Oracle:WŁĄCZ WYJŚCIE SERWERA za pomocą Toad

  3. Oracle - w tym zakresie nie istnieje funkcja o nazwie X

  4. Nie można wstawić znaków arabskich do bazy danych Oracle

  5. Oracle SELECT — podwójne cudzysłowy czy brak podwójnych cudzysłowów?