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

dwie kolumny Pivoting w Oracle SQL

Dla określonej liczby par wartości w kolumnach tname, ttype możesz użyć poniższego zapytania (zauważ, że zmieniłem nazwy kolumn z przykładu, ponieważ użyłeś tam słów kluczowych Oracle, również nazwałem tabelę jako tasks , więc będziesz musiał zmienić te dane na swoje prawdziwe nazwy kolumn i nazwę tabeli wszędzie w kodzie) :

select * from tasks 
pivot (max(tdate) for (tname, ttype) in 
  (('DG1','CF') DG1_CF, ('M0','A')  M0_A,  ('M0','POR') M0_POR,
   ('M1','A'  ) M1_A,   ('M1','CF') M1_CF, ('M2','A')   M2_A)));

Dla dynamicznej liczby możliwości będziesz potrzebować pewnej procedury "tworzenia" tego zapytania. Tutaj użyłem view w tym celu.Skopiuj kod procedury i skompiluj ją. Kiedy dane w tabeli ulegną zmianie, musisz najpierw uruchomić procedurę, a następnie po prostu wybrać widok utworzony przez procedurę. Aby schemat działał poprawnie, musisz mieć przyznane uprawnienia do tworzenia widoków.

execute create_tasks_view;
select * from v_tasks;

anonymous block completed
   ID DG1_CF     M0_A       M0_POR     M1_A       M1_CF      M2_A     
----- ---------- ---------- ---------- ---------- ---------- ----------
45000 2015-03-02 2015-02-01 2015-03-11 2015-02-03 2015-03-01 2015-02-04 
44400 2015-02-02 2015-01-01 2015-02-11 2015-01-03 2015-02-01 2015-01-04

Oczywiście możesz zmienić kolejność wierszy i kolumn według własnego uznania, dodając lub modyfikując order by części w kodzie procedury:

create or replace procedure create_tasks_view as 
  v_sql varchar2(32767) := '';
begin
  for v in (select distinct tname, ttype from tasks order by tname, ttype) 
  loop
    v_sql := v_sql || '(''' || v.tname || ''',''' || v.ttype || ''') '
      ||v.tname||'_'||v.ttype||',';
  end loop;
  v_sql := 'create or replace view v_tasks as '
    ||'select * from tasks pivot (max(tdate) for (tname, ttype) in ('
    ||rtrim(v_sql, ', ')||'))'; 
  execute immediate v_sql;
end create_tasks_view;

Wierzę, że jest też bardziej uniwersalne rozwiązanie na Twoje pytanie w linku, który podałem w komentarzach:Dynamiczne obracanie SQL... . Wygląda bardzo obiecująco, po prostu przeczytaj uważnie sekcję Zasoby na dole i postępuj zgodnie z instrukcjami. Nie sprawdziłem tej metody osobiście, ale może to będzie Ci odpowiadać bardziej niż moje rozwiązanie „widok procedury”.




  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 Oracle to_date. Potrzebna maska

  2. SQL:jak korzystać z UNION i zamawiać według konkretnego wyboru?

  3. Jak wyświetlić wynik instrukcji SELECT, która jest wykonywana przy użyciu natywnego dynamicznego SQL?

  4. Oracle ORA-01805 na bazie danych Oracle 11g

  5. Zmień składnik strefy czasowej TIMESTAMP WITH TIMEZONE w Oracle