0

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

例如: 包P1有组件C1C2C3。每个项目C1,C2C3范围为 10 个位置 1,2....10,这样C1-1, C1-2,..., C1-10, C2-1, C2-2,..., C2-10, 和C3-1, C3-2,...,C3-10存在。在这种情况下,包装物品P1也与位置 1 到 10 相关联,如P1-1P1-2、...、P1-10

该表PACK_BREAKOUT包含 Pack 组件映射,并且该表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

请注意,即使一个组件不匹配 no。作为包中的其他组件的位置,必须将整个包视为不一致(如P5)。

4

1 回答 1

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
于 2013-02-01T22:24:08.187 回答