sql >> Database teknologi >  >> RDS >> Oracle

to kolonner Pivotering i Oracle SQL

For defineret antal værdipar i kolonner tname, ttype du kan bruge nedenstående forespørgsel (bemærk, at jeg ændrede dine kolonnenavne fra eksempel, fordi du brugte Oracle-nøgleord der, og jeg navngav også tabel som tasks , så du bliver nødt til at ændre disse data til dine rigtige kolonnenavne og tabelnavn overalt i koden) :

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

For et dynamisk antal muligheder har du brug for en procedure, der "opretter" denne forespørgsel. Her brugte jeg view til dette.Kopiér procedurekoden og kompiler den. Når data i din tabel ændres, skal du først køre proceduren, derefter skal du blot vælge fra visning oprettet af procedure. For at køre korrekt skal dit skema have rettigheder til at oprette visninger.

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

Du kan selvfølgelig ændre rækkefølgen af ​​rækker og kolonner som du ønsker ved at tilføje eller ændre order by dele i procedurekode:

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;

Jeg tror, ​​der også er en mere universel løsning på dit spørgsmål i linket, jeg gav dig i kommentarerne:Dynamisk SQL-drejning... . Det ser meget lovende ud, bare læs omhyggeligt afsnittet Ressourcer nederst, og følg instruktionerne. Jeg tjekkede ikke denne metode personligt, men måske vil denne passe dig mere end min "procedure-view"-løsning.




  1. MySQL datetime sammenligning med forrige række

  2. Implementering af twitter og facebook som hashtags

  3. Adgang til MySql-database fra PHP-fil på lokal vært

  4. Oracle - Vælg, hvor feltet har små bogstaver