まず、2 つの「id」の「色」が同じかどうかを確認する必要があります。次のクエリは、 に対して完全外部結合を実行し、color
によって集計しid
ます。2 つid
の が同じ色の場合、完全外部結合は常に一致します。NULL はありません。
select s1.id, s2.id
from s s1 full outer join
s s2
on s1.color = s2.color
group by s1.id, s2.id
having sum(case when s1.color is null then 1 else 0 end) = 0 and
sum(case when s2.color is null then 1 else 0 end) = 0
同じ考え方を使用して、最小の s1.id をグループの「id」として割り当てることができます。このグループ ID は、最終的な集計に必要な情報を提供します。
select s3.groupid, sum(s3.quantity) as quantity, s3.color as color
from (select min(s1.id) as groupid, s2.id
from (select s1.id, s2.id
from s s1 full outer join
s s2
on s1.color = s2.color
group by s1.id, s2.id
having sum(case when s1.color is null then 1 else 0 end) = 0 and
sum(case when s2.color is null then 1 else 0 end) = 0
) ss
group by s2.id
) sg join
s s3
on sg.id = s.id
group by sg.groupid, s3.color
DB2 では、これを で行うこともできますlistagg
。まず、共通性を識別するために色のリストを取得してから、それを使用する必要があります。
select min(s.id) as groupid, sum(s.quantity) as quantity, s.color
from (select id, listagg(color order by color) as thegroup
from s
group by id
) sg join
s
on sg.id = s.id
group by sg.thegroup, s.color
これはおそらく最初のソリューションよりも効率的です。