Requête SQL pour get les meilleurs loggings avec la plus grande valeur de 2 colonnes

J'ai une requête qui returnne SUM de 2 colonnes avec le prénom et le nom du client.

Il revient environ 40000 loggings. Ma question est: –

SELECT SUM(Orders.BusinessVolumeTotal) AS BV, SUM(Orders.CommissionableVolumeTotal) AS PV, ISNULL(Customers.FirstName,''), Customers.LastName FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID WHERE Orders.OrderDate >= convert(DATETIME, '1/1/2013 12:00:00 AM') AND Orders.OrderDate < convert(DATETIME, '12/31/2013 12:00:00 AM') GROUP BY Customers.FirstName, Customers.LastName 

Mais je veux juste returnner 10 lignes avec les valeurs les plus élevées dans BV et PV coluymns.

Merci d'avance.

Basé sur un groupe de deux colonnes, vous pouvez get les 10 premières lignes comme ci-dessous:

 SELECT TOP 10 SUM(Orders.BusinessVolumeTotal) AS BV, SUM(Orders.CommissionableVolumeTotal) AS PV, ISNULL(Customers.FirstName,''), Customers.LastName FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID WHERE Orders.OrderDate >= convert(DATETIME, '1/1/2013 12:00:00 AM') AND Orders.OrderDate < convert(DATETIME, '12/31/2013 12:00:00 AM') GROUP BY Customers.FirstName, Customers.LastName ORDER BY SUM(Orders.BusinessVolumeTotal) + SUM(Orders.CommissionableVolumeTotal) DESC 

Si vous voulez les 10 rangées les plus élevées par groupe, vous pouvez utiliser ROW_NUMBER dans un CTE :

 WITH CTE AS ( SELECT SUM(Orders.BusinessVolumeTotal) OVER(PARTITION BY Customers.FirstName, Customers.LastName) AS BV, SUM(Orders.CommissionableVolumeTotal) OVER(PARTITION BY Customers.FirstName, Customers.LastName) AS PV, ISNULL(Customers.FirstName,'') As FirstName, Customers.LastName, RN = ROW_NUMBER() OVER(PARTITION BY Customers.FirstName, Customers.LastName ORDER BY (Orders.BusinessVolumeTotal + Orders.CommissionableVolumeTotal) DESC) FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID WHERE Orders.OrderDate >= convert(DATETIME, '1/1/2013 12:00:00 AM') AND Orders.OrderDate < convert(DATETIME, '12/31/2013 12:00:00 AM') ) SELECT * FROM CTE WHERE RN <= 10 

Une façon d'get à la fois le top 10 pour BV et le top 10 pour PV est d'écrire une requête pour chacun:

 SELECT TOP 10 SUM(Orders.BusinessVolumeTotal) AS BV, SUM(Orders.CommissionableVolumeTotal) AS PV, ISNULL(Customers.FirstName,''), Customers.LastName FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID WHERE Orders.OrderDate >= convert(DATETIME, '1/1/2013 12:00:00 AM') AND Orders.OrderDate < convert(DATETIME, '12/31/2013 12:00:00 AM') GROUP BY Customers.FirstName, Customers.LastName ORDER BY BV DESC SELECT TOP 10 SUM(Orders.BusinessVolumeTotal) AS BV, SUM(Orders.CommissionableVolumeTotal) AS PV, ISNULL(Customers.FirstName,''), Customers.LastName FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID WHERE Orders.OrderDate >= convert(DATETIME, '1/1/2013 12:00:00 AM') AND Orders.OrderDate < convert(DATETIME, '12/31/2013 12:00:00 AM') GROUP BY Customers.FirstName, Customers.LastName ORDER BY PV DESC