Click here to Skip to main content
15,893,161 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
How can I modify the queries below and still get the same result without using TOP?

This query gives the most profitable salesperson:
SQL
SELECT TOP 1  Salespersons.empid, Salespersons.ename,(SUM(ORDERITEMS.qty*INVENTORY.price) - SALESPERSONS.salary) AS 'MostProfitable_SalesPerson'
FROM  Inventory INNER JOIN
               OrderItems ON Inventory.partid = OrderItems.partid INNER JOIN
               Orders ON OrderItems.orderid = Orders.orderid INNER JOIN
               Salespersons ON Orders.empid = Salespersons.empid
               
GROUP BY  Salespersons.empid, Salespersons.ename,SALESPERSONS.salary  
ORDER BY  MostProfitable_SalesPerson DESC;

------------------------------------------------------------------------------

This query gives the second profitable salesperson:
SQL
SELECT TOP 1  Salespersons.empid, Salespersons.ename,(SUM(ORDERITEMS.qty*INVENTORY.price) - SALESPERSONS.salary) AS 'MostProfitable_SalesPerson'
FROM  Inventory INNER JOIN
               OrderItems ON Inventory.partid = OrderItems.partid INNER JOIN
               Orders ON OrderItems.orderid = Orders.orderid INNER JOIN
               Salespersons ON Orders.empid = Salespersons.empid
               
GROUP BY  Salespersons.empid, Salespersons.ename,SALESPERSONS.salary  
ORDER BY  MostProfitable_SalesPerson ASC;
Posted
Updated 16-Jan-13 6:43am
v3
Comments
Zoltán Zörgő 16-Jan-13 12:58pm    
What's the difference between these two queries? I don't see any.
[no name] 16-Jan-13 13:27pm    
just ORDER BY difference :) ASC & DESC

In SQL2005 and above, you have ROW_NUMBER[^] function.
Here is the "common sample" with subquery:

SQL
USE AdventureWorks;
GO

SELECT *
FROM 
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader
)
WHERE RowNumber = 5;


In your case, you will need to change the inner query with yours, and of course, you will need to apply the proper OVER clause.
 
Share this answer
 
v3
 
Share this answer
 
You can use the WITH - Common Table Expression with ROW_NUMBER function for this.

first you have to create a CTE with row number. then it works like following table
empid ename   MostProfitable_SalesPerson ROWNUMBER
13    alferd  1500                       1
34    kevin   1300                       2
3     syard   1100                       3

Then you can select the top most profitable record by rownumber = 1
and 2nd Most rownumber=2 etc ..
SQL
WITH MostProfitable_SalesPersons(empid,ename,MostProfitable_SalesPerson,ROWNUMBER) AS (
	SELECT Salespersons.empid, Salespersons.ename,
(SUM(ORDERITEMS.qty*INVENTORY.price) - SALESPERSONS.salary) AS 'MostProfitable_SalesPerson',
ROW_NUMBER() OVER(ORDER BY SUM(ORDERITEMS.qty*INVENTORY.price) - SALESPERSONS.salary DESC)
FROM  Inventory INNER JOIN
               OrderItems ON Inventory.partid = OrderItems.partid INNER JOIN
               Orders ON OrderItems.orderid = Orders.orderid INNER JOIN
               Salespersons ON Orders.empid = Salespersons.empid
               
GROUP BY  Salespersons.empid, Salespersons.ename,SALESPERSONS.salary )

SELECT empid,ename,MostProfitable_SalesPerson
FROM MostProfitable_SalesPersons
WHERE ROWNUMBER=1
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900