每个商店的前 20 个 SKU 数量
Top 20 Count of SKUs per Store
我正在尝试创建一个查询,以提取每家商店前 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() 在同一个查询中是否与 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;
我正在尝试创建一个查询,以提取每家商店前 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() 在同一个查询中是否与 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;