情景 - 我们有包装物品,它被定义为一个或多个物品的合成物。复杂包是具有多个组件的包。复杂包装物品的每个组件物品应链接到相同数量的位置。
例如:
包P1
包含组件C1
,C2
和C3
。每个项C1
,C2
和C3
范围为10个位置1,2 .... 10,C1-1
,C1-2
,... ,C1-10
,C2-1
,C2-2
,...,C2-10
和C3-1
,C3-2
,...,{{1}存在。在这种情况下,包裹项C3-10
也会与位置1到10相关联,如P1
,P1-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
)。
答案 0 :(得分: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