行值不一致

时间:2013-02-01 22:20:16

标签: sql oracle

情景 - 我们有包装物品,它被定义为一个或多个物品的合成物。复杂包是具有多个组件的包。复杂包装物品的每个组件物品应链接到相同数量的位置。

例如: 包P1包含组件C1C2C3。每个项C1C2C3范围为10个位置1,2 .... 10,C1-1C1-2,... ,C1-10C2-1C2-2,...,C2-10C3-1C3-2,...,{{1}存在。在这种情况下,包裹项C3-10也会与位置1到10相关联,如P1P1-1,...,P1-2

P1-10包含Pack组件映射,表PACK_BREAKOUT包含要与位置关联的项。包和组件都被视为“项目”,并且将存在于ITEM_LOCATION

理想情况下,对于上述情况,下面的记录集有效

ITEM_LOCATION

我在下面的查询中返回所有此类包装项目的结果。

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

但是,有一些不一致的结果,如包装号。下面的P2,P4和P5,其中组件与相同数量的位置无关。

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;

请注意,一个包可以包含n个组件(如您所见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 )。

1 个答案:

答案 0 :(得分: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