【问题标题】:Top 20 Count of SKUs per Store每个商店的前 20 个 SKU 计数
【发布时间】:2018-07-05 15:52:07
【问题描述】:

我正在尝试创建一个查询,以获取每家商店的前 20 个缺货 SKU。这是我到目前为止所拥有的:

;with top20OOS as
(select wi.SKU 
, count(wi.SKU) OOSCount
, wi.ProductId
, wi.PseudoStoreId
from WaveItem wi (nolock)
where wi.isOutOfStock = 1
and DateAdded between '2018-01-01' and '2018-05-31'
group by wi.SKU, p.ProductName, wi.ProductId, bo.brandname, p.size, mo.name, 
wi.PseudoStoreId
)

select oos.SKU
, oos.ProductName
, oos.OOSCount
, s.StoreName
, s.StoreID from top20OOS oos
join WaveItem wi (nolock) on  wi.ProductId = oos.ProductId
    and wi.PseudoStoreId = oos.PseudoStoreId
join tblStore s (nolock) on s.PseudoStoreID = wi.PseudoStoreId
where s.StoreID in (1094,1088)
and DateAdded between '2018-01-01' and '2018-05-31'
group by oos.SKU, oos.ProductName, s.StoreName, s.StoreID, oos.OOSCount
order by s.StoreName asc, OOSCount desc

这只是提取了商店 1094 和 1088 的所有缺货 SKU,我需要将其限制为每家商店的前 20 个。我正在使用 SQL Server 2017

【问题讨论】:

  • 您的问题是什么,如果有错误,您可以发布错误吗?
  • 您需要添加一个 ROW_NUMBER() OVER (PARTITION BY store ORDER BY x,y,z) AS rn。然后 WHERE rn

标签: sql sql-server subquery common-table-expression sql-server-2017


【解决方案1】:

这有点冗长,因为我不记得 ROW_NUMBER() 是否在同一个查询中与 Group By 配合得很好,所以我出于谨慎考虑而犯了错误,并将其分解为单独的子查询。

;with top20OOS as
(select wi.SKU 
, count(wi.SKU) OOSCount
, wi.ProductId
, wi.PseudoStoreId
from WaveItem wi (nolock)
where wi.isOutOfStock = 1
and DateAdded between '2018-01-01' and '2018-05-31'
group by wi.SKU, p.ProductName, wi.ProductId, bo.brandname, p.size, mo.name, 
wi.PseudoStoreId
)

SELECT sku,
       productName,
       OOSCount,
       StoreName,
       StoreID     
  FROM (SELECT sku,
               productName,
               OOSCount,
               StoreName,
               StoreID,
               ROW_NUMBER() OVER
                 ( PARTITION BY StoreID 
                       ORDER BY OOSCount
                 ) AS rn
          FROM (select oos.SKU
                , oos.ProductName
                , oos.OOSCount
                , s.StoreName
                , s.StoreID from top20OOS oos
                join WaveItem wi (nolock) on  wi.ProductId = oos.ProductId
                    and wi.PseudoStoreId = oos.PseudoStoreId
                join tblStore s (nolock) on s.PseudoStoreID = wi.PseudoStoreId
                where s.StoreID in (1094,1088)
                and DateAdded between '2018-01-01' and '2018-05-31'
                group by oos.SKU, oos.ProductName, s.StoreName, s.StoreID, oos.OOSCount
               ) TMP
       ) TMP2
 WHERE rn <= 20;

【讨论】:

  • 太棒了!如果它对您有用,请接受答案以节省其他人的时间。
猜你喜欢
  • 1970-01-01
  • 2012-04-09
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2019-08-27
  • 2017-08-23
  • 1970-01-01
相关资源
最近更新 更多