Condition SQL pour order une base sur un groupe par

Comment order des données, base dans le StockID étant 3 et ayant également deux entrepôt dans ce cas les WarehouseId 1 et 13,

select ProductID, WarehouseID, StockID from @allStocksState group by ProductID, WarehouseID, StockID order by CASE WHEN StockID = 3 then 0 else 1 end 

Résultat:

 7002 13 3 7003 1 3 7003 13 3 7012 1 3 7012 13 3 6995 1 3 7020 13 3 7031 13 3 7045 1 3 7045 13 3 7046 1 3 7046 13 3 

Donc, dans le cas de 6995,7020,7031 Devrait apparaître à la fin, car dans ce cas, ils ont seulement un WarehouseId chacun, alors quels changements à ma requête dois-je appliquer? Toute aide serait très appréciée.

Vous pouvez utiliser les fonctions de la window dans l' order by :

 select ProductID, WarehouseID, StockID from @allStocksState group by ProductID, WarehouseID, StockID order by count(*) over (partition by productid) desc, (case when StockID = 3 then 0 else 1 end); 

Le count(*) over (partition by productid) count combien de lignes ont le même productid .

 select ProductID,WarehouseID,StockID from @allStocksState group by ProductID,WarehouseID,StockID order by CASE WHEN StockID=3 then "ASC" else "DESC" end