Oracle
 sql >> Base de données >  >> RDS >> Oracle

deux colonnes Pivoting dans Oracle SQL

Pour un nombre défini de paires de valeurs dans les colonnes tname, ttype vous pouvez utiliser la requête ci-dessous (notez que j'ai changé les noms de vos colonnes à partir de l'exemple, car vous y avez utilisé des mots-clés Oracle, j'ai également nommé la table comme tasks , vous devrez donc remplacer ces données par vos vrais noms de colonne et nom de table partout dans le code) :

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

Pour un nombre dynamique de possibilités, vous aurez besoin d'une procédure "créant" cette requête. Ici, j'ai utilisé view pour cela. Copiez le code de la procédure et compilez-le. Lorsque les données de votre table changent, vous devez d'abord exécuter la procédure, puis sélectionner simplement la vue créée par la procédure. Pour fonctionner correctement, votre schéma a besoin de privilèges pour créer des vues accordées.

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

Bien sûr, vous pouvez modifier l'ordre des lignes et des colonnes comme vous le souhaitez en ajoutant ou en modifiant order by pièces en code procédure :

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;

Je pense qu'il existe également une solution plus universelle pour votre question dans le lien que je vous ai donné dans les commentaires :Pivot SQL dynamique... . Cela semble très prometteur, il suffit de lire attentivement la section Ressources en bas, et suivez les étapes d'instruction. Je n'ai pas vérifié cette méthode personnellement, mais peut-être que cela vous conviendra mieux que ma solution "procédure-view".