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".