从库存移动中查找80%时间使用的组件



我试图将我需要做的3D建模限制在各种类别中最常用的部分。我希望截断点是,按照使用的降序,我已经覆盖了总使用量的80%。我已经得到了大部分的方式,但由于某种原因,Microsoft SQL Management Studio抱怨当我试图做一些事情得到80%。

下面是我所拥有的,除了在查询中创建更多的辅助列之外,没有其他对查询真正有用的列:

select
PartFrequency.StockCode,
InvMaster.Description,
PartFrequency.Qty
from (
select top 1000
InvMaster.StockCode,
sum(InvMovements.TrnQty) as Qty
from InvMaster
right join InvMovements
on InvMaster.StockCode = InvMovements.StockCode
where InvMaster.Description LIKE '%Bag/%'
group by
InvMaster.StockCode
order by
Qty DESC
) PartFrequency
left join InvMaster
on PartFrequency.StockCode = InvMaster.StockCode
--where (sum(PartFrequency.Qty) over (order by PartFrequency.Qty DESC))<sum(PartFrequency.Qty)*0.8
order by
Qty DESC

它现在在抱怨WHERE子句,我已经把它注释掉了,但是包含了它,所以你至少可以从概念上看到我要做什么。

您需要在派生子查询中计算窗口函数。

  • 请注意,这是SUM(SUM()) OVERie窗口超过聚合的情况。
  • 你应该把rows unbounded preceding加到运行和,否则你可能会得到错误的结果(它也更快)。
  • 右连接没有多大意义,因为内部的where过滤掉了,所以你不妨做一个内部连接。
  • 另一个左连接是不必要的,因为您已经拥有所需的所有数据。你可以添加更多的分组列
select
PartFrequency.StockCode,
PartFrequency.Description,
PartFrequency.Qty
from (
select top 1000
ma.StockCode,
ma.Description
sum(mv.TrnQty) as Qty,
sum(sum(mv.TrnQty)) over
(order by sum(mv.TrnQty) DESC rows unbounded preceding) as Running
from InvMaster ma
join InvMovements mv
on ma.StockCode = mv.StockCode
where mv.Description LIKE '%Bag/%'
group by
ma.StockCode,
ma.Description
order by
Qty DESC
) PartFrequency
where PartFrequency.Running < PartFrequency.Qty * 0.8
order by
Qty DESC;

最后的where的逻辑对我来说没有意义,除非有许多负值,但我看不到你的数据。

最新更新