create table item (id number not null, item_name varchar2(200) not null);
create table color (id number not null, color_name varchar2(200) not null);
create table item_color (item_id number not null, color_id number not null);
insert into item values (1, 'item 1');
insert into item values (2, 'item 2');
insert into item values (3, 'item 3');
insert into color values (1, 'red');
insert into color values (2, 'blue');
insert into color values (3, 'green');
insert into item_color values (1, 1);
insert into item_color values (1, 3);
insert into item_color values (2, 2);
insert into item_color values (2, 3);
insert into item_color values (3, 2);
commit;
puis sélectionnez:
select * from
(
select
i.item_name
, c.color_name
from
item i
, color c
, item_color ic
where
ic.item_id = i.id
and ic.color_id = c.id
) pivot (
count(color_name) cnt
for color_name in ('red', 'blue', 'green')
);
donne:
item 1 1 0 1
item 2 0 1 1
item 3 0 1 0
au cas où vous ne connaissez pas la liste des couleurs à l'avance, vous pouvez sélectionner la table de couleurs d'abord, puis construire le pivot sélectionnez dynamiquement (une sous-sélection comme for color_name in (select color_name from color)
n'est pas possible) ou bien vous pouvez utiliser pivot xml
et post-traiter le résultat:
select * from
(
select
i.item_name
, c.color_name
from
item i
, color c
, item_color ic
where
ic.item_id = i.id
and ic.color_id = c.id
) pivot xml (
count(color_name) cnt
for color_name in (any)
)
donne:
item 1 <PivotSet><item><column name = "COLOR_NAME">green</column><column name = "CNT">1</column></item><item><column name = "COLOR_NAME">red</column><column name = "CNT">1</column></item></PivotSet>
item 2 <PivotSet><item><column name = "COLOR_NAME">blue</column><column name = "CNT">1</column></item><item><column name = "COLOR_NAME">green</column><column name = "CNT">1</column></item></PivotSet>
item 3 <PivotSet><item><column name = "COLOR_NAME">blue</column><column name = "CNT">1</column></item></PivotSet>
@rexem: Comment procéder pour grouper les résultats de manière à ce que chaque nom d'article apparaisse une seule fois et que chaque "indicateur" de couleur apparaisse dans cette même ligne? (voir la sortie désirée dans ma question comme un exemple) –
@Colin: Réponse mise à jour. –
@rexem: Merci beaucoup pour la réponse complète. Cela produit ce que j'espérais. J'ai dû supprimer les parenthèses autour de la chaîne après chaque "END" et après chaque "MAX()", car j'obtenais des erreurs dans TOAD. Une idée de pourquoi? Merci encore pour votre aide. –