0

複数の行にまたがる同じ外部キーの存在によって集計する方法を探しています。

たとえば、ID 番号 1 と 2 はすべての行でまったく同じ外部キーを持っているため、一緒に集計する必要がありますが、ID 番号 3 はすべての行で同じ外部キーを持っていないため、別々にする必要があります。

注: DB2 の使用

ソース データの例:

ID  QUANTITY    COLOR
1   10          BLUE
1   10          RED
1   10          GREEN
2   30          BLUE
2   30          RED
2   30          GREEN
3   15          GREEN
3   15          YELLOW

望ましい結果セット:

TEMP_ID     SUMQTY  COLOR
1           40      BLUE
1           40      RED
1           40      GREEN
2           15      GREEN
2           15      YELLOW
4

1 に答える 1

1

まず、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

これはおそらく最初のソリューションよりも効率的です。

于 2013-03-31T00:46:16.133 に答える