sql >> Databasteknik >  >> RDS >> Oracle

två kolumner Pivotering i Oracle SQL

För definierat antal värdepar i kolumnerna tname, ttype du kan använda nedanstående fråga (observera att jag ändrade dina kolumnnamn från exempel, eftersom du använde Oracle-sökord där, och jag namngav tabellen som tasks , så du måste ändra dessa data till dina riktiga kolumnnamn och tabellnamn överallt 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)));

För ett dynamiskt antal möjligheter behöver du någon procedur för att "skapa" denna fråga. Här använde jag view för detta. Kopiera procedurkoden och kompilera den. När data i din tabell ändras måste du först köra proceduren, välj sedan helt enkelt från den vy som skapats av proceduren. För att ditt schema ska kunna köras korrekt behöver du behörighet för att skapa vyer.

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

Naturligtvis kan du ändra ordningen på rader och kolumner som du vill genom att lägga till eller ändra order by delar i procedurkod:

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;

Jag tror att det också finns en mer universell lösning för din fråga i länken jag gav dig i kommentarerna:Dynamisk SQL-svängning... . Det ser mycket lovande ut, läs bara avsnittet Resurser noggrant längst ner och följ instruktionerna. Jag kontrollerade inte den här metoden personligen, men det kanske passar dig mer än min "procedur-view"-lösning.




  1. Webbplatsen har hackats via SQL Injection

  2. Ogiltiga argument passerade fel för dag som laddar mysql-data till bigquery med hjälp av luftflöde

  3. Doctrine Query Language få max/senaste raden per grupp

  4. Hur kan jag få emacs sql-mode att använda mysql-konfigurationsfilen (.my.cnf)?