2017-03-23 2 views
0

J'ai une requête où je peux trouver tous les produits, tous les clients qui ont acheté chaque produit et la quantité.SQL Et Northwind

select OD.ProductID, OD.Quantity, O.CustomerID 
from dbo.[Order Details] OD inner join dbo.Orders O on OD.OrderID = O.OrderID 
Order by OD.ProductID ASC, OD.Quantity DESC 

Mais ce dont j'ai besoin est de savoir quel client a acheté le plus de chaque produit. Comment puis-je le faire?

+0

Quelle version de SQL Server? Dans les versions ultérieures, vous pouvez utiliser RANK() pour résoudre ce problème. –

+0

SQL Server 2014 –

Répondre

0

Vous pouvez utiliser top 1 with ties avec fonction rank fenêtre:

select top 1 with ties OD.ProductID, 
    OD.Quantity, 
    O.CustomerID 
from dbo.[Order Details] OD 
inner join dbo.Orders O on OD.OrderID = O.OrderID 
order by rank() over (
     partition by OD.ProductID order by OD.Quantity desc 
     ); 

ci-dessus renverra plusieurs lignes par productId s'il y a plusieurs clients avec la quantité maximale commandée pour ce produit.

Si vous voulez obtenir une seule ligne, vous pouvez utiliser row_number:

select top 1 with ties OD.ProductID, 
    OD.Quantity, 
    O.CustomerID 
from dbo.[Order Details] OD 
inner join dbo.Orders O on OD.OrderID = O.OrderID 
order by row_number() over (
     partition by OD.ProductID order by OD.Quantity desc 
     ); 

Vous pouvez aussi le faire sans top:

select * 
from (
    select OD.ProductID, 
     OD.Quantity, 
     O.CustomerID, 
     row_number() over (
      partition by OD.ProductID order by OD.Quantity desc 
      ) as rn 
    from dbo.[Order Details] OD 
    inner join dbo.Orders O on OD.OrderID = O.OrderID 
    ) t 
where rn = 1; 
+0

Y a-t-il un moyen de le faire avec la sous-requête? Je n'ai jamais utilisé de rang ou avec des liens –

+0

@WaltherEmilioCarrasco - Les fonctions de fenêtre fonctionnent très bien pour ce genre de problèmes. Si vous ne voulez pas utiliser 'top', voir la troisième requête dans la réponse mise à jour. – GurV

+0

Vous devriez saisir cette opportunité pour apprendre à utiliser les fonctions de fenêtre. –