sql >> Databáze >  >> RDS >> Oracle

dva sloupce Pivoting v Oracle SQL

Pro definovaný počet párů hodnot ve sloupcích tname, ttype můžete použít níže uvedený dotaz (všimněte si, že jsem změnil názvy vašich sloupců z příkladu, protože jste tam použili klíčová slova Oracle, také jsem pojmenoval tabulku jako tasks , takže budete muset změnit tato data na vaše skutečné názvy sloupců a název tabulky všude v kódu):

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

Pro dynamický počet možností budete potřebovat nějakou proceduru "vytvoření" tohoto dotazu. Zde jsem použil view zkopírujte kód procedury a zkompilujte jej. Když se data ve vaší tabulce změní, musíte nejprve spustit proceduru a poté jednoduše vybrat z pohledu vytvořeného procedurou. Aby vaše schéma fungovalo správně, potřebuje udělená oprávnění pro vytváření pohledů.

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

Samozřejmě můžete změnit pořadí řádků a sloupců, jak chcete, přidáním nebo úpravou order by části v kódu 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;

Věřím, že existuje také univerzálnější řešení pro vaši otázku v odkazu, který jsem vám dal v komentářích:Dynamické pivotování SQL... . Vypadá to velmi slibně, jen si pozorně přečtěte sekci Zdroje dole a postupujte podle pokynů. Osobně jsem tuto metodu nekontroloval, ale možná vám bude vyhovovat více než moje řešení „pohled na proceduru“.




  1. Nakonfigurujte Lucene.Net s SQL Server

  2. Laravel 4:vlastní přihlášení a kontrola hesla

  3. Poradní zámky nebo NOWAIT, abyste se vyhnuli čekání na zamčené řádky?

  4. Řadové zámky - jejich ruční použití