2013-02-01 18 views
0

情景 - 我們有包裝物品,它被定義爲一個或多個物品的合成物。一個複雜的包是一個有多個組件項目的包。複雜包裝物品的每個組件項目都應鏈接到相同數量的位置。行值不一致

例如: 包P1具有分量C1C2,和C3。每個項目C1C2C3是介於10點的位置1,2 .... 10,使得C1-1C1-2,...,C1-10C2-1C2-2,...,C2-10,和C3-1C3-2,.. 。,C3-10存在。在這種情況下,包裝項目P1也與位置1到10相關聯,如P1-1,P1-2,...,P1-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 

注意,一個包可以有分量的正數(因爲你可以看到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 

請注意,即使一個組件不匹配no。作爲包裝內其他組件的位置,整個包裝必須被視爲不一致(如P5)。

回答

3

您想使用其他group byhaving條款:

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 
+0

AHHHH! 'MIN(numlocs)<> MAX(numlocs)'是個絕招......真棒。非常感謝。 – Annjawn