场景-我们有包项,它被定义为一个或多个项目的组合。复杂包是一个包含多个组件项的包。复杂包项的每个组件项应该链接到相同数量的位置。
例如,:Pack 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、……、C3-10存在。在这种情况下,pack项P1也被关联到位置1到10,如P1-1、P1-2、.、P1-10。
表PACK_BREAKOUT包含包组件映射,表ITEM_LOCATION包含项到位置关联。包和组件都被视为“项”,并将存在于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;然而,也有一些不一致的结果,如pack no。在下面的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)。
发布于 2013-02-01 22:24:08
您希望使用另一个带有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 <> maxnumlocshttps://stackoverflow.com/questions/14656007
复制相似问题