Топ 20 по количеству SKU в магазине - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь создать запрос, который опускает 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

Это просто вытягивает все отсутствующие SKU для магазинов 1094 и 1088, и мне нужно ограничить его до 20 лучших в магазине. Я использую SQL Server 2017

1 Ответ

0 голосов
/ 05 июля 2018

Это немного многословно, потому что я не могу вспомнить, хорошо ли 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;
...