sql >> Database >  >> RDS >> Oracle

twee kolommen Draaien in Oracle SQL

Voor gedefinieerd aantal waardeparen in kolommen tname, ttype u kunt de onderstaande query gebruiken (merk op dat ik uw kolomnamen van bijvoorbeeld heb gewijzigd, omdat u daar Oracle-sleutelwoorden gebruikte, ook heb ik de tabel genoemd als tasks , dus u zult deze gegevens overal in code moeten wijzigen in uw echte kolomnamen en tabelnaam) :

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

Voor een dynamisch aantal mogelijkheden heeft u een procedure nodig om deze query te "creëren". Hier gebruikte ik view hiervoor.Kopieer de procedurecode en compileer deze. Als de gegevens in uw tabel veranderen, moet u eerst de procedure uitvoeren en vervolgens eenvoudig selecteren uit de weergave die door de procedure is gemaakt. Om goed te kunnen werken, heeft uw schema rechten nodig voor het maken van verleende weergaven.

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

Natuurlijk kunt u de volgorde van rijen en kolommen naar wens wijzigen door order by toe te voegen of aan te passen onderdelen in procedurecode:

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;

Ik geloof dat er ook een meer universele oplossing is voor uw vraag in de link die ik u in opmerkingen heb gegeven:Dynamische SQL Pivoting... . Het ziet er veelbelovend uit, lees aandachtig de sectie Bronnen onderaan en volg de instructies. Ik heb deze methode niet persoonlijk gecontroleerd, maar misschien past dit meer bij je dan mijn "procedure-view"-oplossing.




  1. PLS-00103:Ontmoet het symbool CREATE

  2. Hoe paginaweergaven te volgen zonder de MySQL DB te verslaan

  3. Cursors gebruiken voor paging in PostgreSQL

  4. Wat zijn sequentiële versus parallelle streams in Java?