【问题标题】:Row value inconsistency行值不一致
【发布时间】:2013-02-02 06:24:08
【问题描述】:

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

例如: 包P1 具有组件C1C2C3。每个项目 C1,C2C3 的范围为 10 个位置 1,2....10,这样 C1-1,C1-2,...,C1-10,C2-1,@ 987654332@,...,C2-10,和C3-1,C3-2,...,C3-10 存在。在这种情况下,包装项目 P1 也与位置 1 到 10 相关联,如 P1-1,P1-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)。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    您想使用另一个带有having 子句的group by

    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
    

    【讨论】:

    • 啊啊啊! MIN(numlocs) &lt;&gt; MAX(numlocs) 是诀窍……太棒了。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多