我在Over Partition by上遇到了一些问题。我正在尝试获得:
inventory ordered列是使用以下代码的问题所在:
select
l.whseloc,l.invtid,
l.qty,
case when f.MRPFlag= 0 then 'NON-Usable' else 'Usable' end as NetStatus,
SUM(p.qtyord-p.qtyrcvd) over (Partition by l.invtid) as InventoryOrdered,
SUM(l.qty*f.mrpflag)over(partition by l.invtid) as TotalNet
from location l (nolock)
join inventory i (nolock) on l.invtid=i.invtid
join loctable f (nolock) on l.whseloc=f.whseloc
left join [dbo].[opspurord] p (nolock) on l.InvtID=p.InvtID
我做错了什么?
发布于 2017-08-12 00:43:24
问题中没有足够的信息(没有样本数据)来告诉您哪里出错了,所以我将描述如何调试和修复问题。
将结果集中的PARTITION BY
列和聚合列显示为单独的列,同时保持其他列不变。
select l.whseloc, l.invtid, l.qty,
case when f.MRPFlag= 0 then 'NON-Usable' else 'Usable' end as NetStatus,
SUM(p.qtyord-p.qtyrcvd) over (Partition by l.invtid) as InventoryOrdered,
p.qtyord-p.qtyrcvd AS InventoryOrderedRowSUM
SUM(l.qty*f.mrpflag)over(partition by l.invtid) as TotalNet,
l.qty*f.mrpflag AS TotalNetRowSUM
from location l (nolock)
...
ORDER BY l.invtid -- Add Order BY to make it easier to analyse data
l.invtid
-这将显示由SUM
函数InventoryOrderedRowSUM
求和的几组行-显示为每行生成的值。如果您手动将给定l.invtid
的这些值相加,您应该会得到与InventoryOrdered
相同的结果。
下一步该怎么做:
通过查看单个InventoryOrderedRowSUM
,您应该能够知道这些值的哪种组合会给您提供所需的结果。一旦解决了这个问题,你就可以调整你的InventoryOrdered
函数了。如果这不明显,那么在将p.qtyord
和p.qtyrcvd
添加到结果集中时,需要重复上述过程。
基于11200可以被1600整除这一事实,我怀疑InventoryOrdered
应该是p.qtyord-p.qtyrcvd
(不需要SUM
)。
https://stackoverflow.com/questions/45644443
复制相似问题