0

シナリオ - 1 つ以上のアイテムの複合体として定義されるパック アイテムがあります。複合パックは、複数のコンポーネント アイテムを含むパックです。コンプレックス パック アイテムの各コンポーネント アイテムは、同じ数のロケーションにリンクする必要があります。

: パックP1には、コンポーネントC1、、C2および がありC3ます。各項目C1C2およびは、 、 、 ...、、、...、、および、... が存在するように、C31,2....10 の 10 の場所に範囲が設定されています。このような場合、パック アイテムは、、、、、、のように1 ~ 10 の場所にも関連付けられます。C1-1C1-2C1-10C2-1C2-2C2-10C3-1C3-2C3-10P1P1-1P1-2P1-10

PACK_BREAKOUTには梱包コンポーネントのマッピングが含まれており、表ITEM_LOCATIONにはアイテムと場所の関連付けが含まれています。Pack と Component はどちらも「アイテム」と見なされ、 に存在しITEM_LOCATIONます。

理想的には、上記のようなシナリオでは、以下のレコードセットが有効です

PACK_NO    ITEM    NO_OF_LOC
--------   ------  -------------
P1         C1      10
P1         C2      10
P1         C3      10

そのようなすべてのパックアイテムに対して上記のような結果を返す以下のクエリがあります。

select c.pack_no,c.item,count(a.loc )
  from item_location a, pack_breakout c
 where c.item=a.item
   group by c.pack_no,c.item
   order by 1,2;

ただし、パック番号のようないくつかの矛盾した結果があります。その下の P2 、 P4 、および P5 は、コンポーネントが同じ数の場所に関連付けられていません。

PACK_NO    ITEM    NO_OF_LOC
--------   ------  -------------
P1         C1      10
P1         C2      10
P1         C3      10
P2         C1      11
P2         C2      5
P2         C3      9
P2         C4      11
P3         C1      21
P3         C2      21
P3         C3      21   
P3         C4      21
P3         C5      21
P4         C1      10
P4         C2      15
P5         C1      10
P5         C2      9
P5         C3      10
P5         C4      10

パックには n 個のコンポーネントを含めることができることに注意してください (コンポーネントのP1, P2, P3, P4, and P5数が異なることがわかります)。

コンポーネントの場所がすべて一致していないパックのみを取得したいと考えています。したがって、望ましい結果セットは次のようになります-

PACK_NO    ITEM    NO_OF_LOC
--------   ------  -------------
P2         C1      11
P2         C2      5
P2         C3      9
P2         C4      11
P4         C1      10
P4         C2      15 
P5         C1      10
P5         C2      9
P5         C3      10
P5         C4      10

1 つのコンポーネントが一致しない場合でも注意してください。パック内の他のコンポーネントとしての場所の、パック全体が矛盾していると見なされる必要があります (のようにP5)。

4

1 に答える 1

3

句で別group byのものを使用したい:having

select pack_no
from (select c.pack_no, c.item, count(a.loc ) as numlocs
      from item_location a join
           pack_breakout c
           on c.item=a.item
      group by c.pack_no, c.item
     ) p
group by pack_no
having MIN(numlocs) <> MAX(numlocs)

これにより、パックが返されます。

数値の詳細が必要な場合は、計算に分析関数を使用します。

select pi.*
from (select pi.*, min(numlocs) over (partition by pack_no) as minnumlocs,
             max(numlocs) over (partition by packno) as maxnumlocs
      from (select c.pack_no, c.item, count(a.loc ) as numlocs
            from item_location a join
                 pack_breakout c
                 on c.item=a.item
            group by c.pack_no, c.item
           ) pi
     ) pi
where minnumlocs <> maxnumlocs
于 2013-02-01T22:24:08.187 に答える