SQL Server Performance Forum – Threads Archive
variables for sorting
Is it possible to use variables for sorting a query? Declare@asc varchar(4),
@sortby varchar(20) SELECT
*
FROM
table
ORDER BY
@Sortby @ASC I can’t get this to work so far but want the query to dynamically change the sort method. Webmaster
Aquinas and More Catholic Goods
www.aquinasandmore.com
No. if you have a list of columns you can use the CASE statement. ***********************
Dinakar Nethi
SQL Server MVP
***********************
http://weblogs.sqlteam.com/dinakar/
YOu can use dynamic sql to do this….
Also check the following….
http://databases.aspfaq.com/database/how-do-i-use-a-variable-in-an-order-by-clause.html
MohammedU.
Moderator
SQL-Server-Performance.com All postings are provided “AS IS†with no warranties for accuracy.
Thanks! That will work great for columns that are in the table but what about columns that are calculated by the query? The case statement doesn’t like those. Webmaster
Aquinas and More Catholic Goods
www.aquinasandmore.com
In that case populate a temp table or table variable then use the case statement on that…
MohammedU.
Moderator
SQL-Server-Performance.com All postings are provided “AS IS†with no warranties for accuracy.
quote:Originally posted by athanasiusrc
Thanks! That will work great for columns that are in the table but what about columns that are calculated by the query? The case statement doesn’t like those.
Webmaster
Aquinas and More Catholic Goods
www.aquinasandmore.com
Please post your code and I’m sure there is a solution for this.
—Aquinas and More Catholic Goods
www.aquinasandmore.com
Frank Kalis
Moderator
Microsoft SQL Server MVP
Webmaster:http://www.insidesql.de
ALTER PROCEDURE [dbo].[pr_getadvertisingReportByDateRange]
@StartDate varchar(10),
@EndDate varchar(10),
@Col varchar(20),
@Dir varchar(5)
AS SELECT
db

sum(ItemPrice * (orderdetails.QTYOrdered-orderdetails.QTYReturned)) as total,
db

db

count(distinct(dbo.orders.order_pk)) as ordertotal,
(sum(ItemPrice * (orderdetails.QTYOrdered-orderdetails.QTYReturned)))/ (count(distinct(dbo.orders.order_pk))) as avgPerOrder,
sum((ItemPrice-ItemCost) * (orderdetails.QTYOrdered-orderdetails.QTYReturned)) as Profit,
(sum((ItemPrice-ItemCost) * (orderdetails.QTYOrdered-orderdetails.QTYReturned))) / (sum(ItemPrice * (orderdetails.QTYOrdered-orderdetails.QTYReturned))) as percentProfit
FROM
db

INNER JOIN
db

ON
db


inner join
dbo.orderstatuses
on
dbo.orders.orderstatus_fk = orderstatuses.orderstatus_pk
INNER JOIN
db

ON
db


INNER JOIN
OrderDetails
ON
Orders.Order_Pk = Order_Fk
WHERE
(db

AND
(db

AND
(db

AND
pending = 0
GROUP BY
db

db

db

ORDER BY
CASE @dir
WHEN ‘desc’ THEN
CASE @col
WHEN ‘ORDERSOURCE’ THEN ORDERSOURCE
WHEN ‘ORDERSOURCESITE’ THEN ORDERSOURCESITE
WHEN ‘ORDERSOURCE_PK’ THEN ORDERSOURCE_PK
WHEN ‘ORDERTOTAL’ THEN ORDERTOTAL
WHEN ‘AvgPerOrder’ THEN AvgPerOrder
WHEN ‘PROFIT’ THEN PROFIT
WHEN ‘TOTAL’ THEN Total
WHEN ‘PercentProfit’ THEN PercentProfit
END
END
DESC,
CASE @dir
WHEN ‘asc’ THEN
CASE @col
WHEN ‘ORDERSOURCE’ THEN ORDERSOURCE
WHEN ‘ORDERSOURCESITE’ THEN ORDERSOURCESITE
WHEN ‘ORDERSOURCE_PK’ THEN ORDERSOURCE_PK
WHEN ‘ORDERTOTAL’ THEN ORDERTOTAL
WHEN ‘AvgPerOrder’ THEN AvgPerOrder
WHEN ‘PROFIT’ THEN PROFIT
WHEN ‘TOTAL’ THEN Total
WHEN ‘PercentProfit’ THEN PercentProfit
END
END Webmaster
Aquinas and More Catholic Goods
www.aquinasandmore.com
And on which column do you want to sort? —
Frank Kalis
Moderator
Microsoft SQL Server MVP
Webmaster:http://www.insidesql.de
I would like to be able to sort on any of the columns based on what is submitted to the sp by the @sortby variable. Webmaster
Aquinas and More Catholic Goods
www.aquinasandmore.com
I can get this to compile but it doesn’t run properly. Error message: Msg 235, Level 16, State 0, Procedure pr_getadvertisingReportByDateRange, Line 49
Cannot convert a char value to money. The char value has incorrect syntax.
ALTER PROCEDURE [dbo].[pr_getadvertisingReportByDateRange]
@StartDate varchar(10),
@EndDate varchar(10),
@Col varchar(20),
@Dir varchar(5)
AS SELECT
db

sum(ItemPrice * (orderdetails.QTYOrdered-orderdetails.QTYReturned)) as total,
db

db

count(distinct(dbo.orders.order_pk)) as ordertotal,
(sum(ItemPrice * (orderdetails.QTYOrdered-orderdetails.QTYReturned)))/ (count(distinct(dbo.orders.order_pk))) as avgPerOrder,
sum((ItemPrice-ItemCost) * (orderdetails.QTYOrdered-orderdetails.QTYReturned)) as Profit,
(sum((ItemPrice-ItemCost) * (orderdetails.QTYOrdered-orderdetails.QTYReturned))) / (sum(ItemPrice * (orderdetails.QTYOrdered-orderdetails.QTYReturned))) as percentProfit
INTO #Tempadrevenue
FROM
db

INNER JOIN
db

ON
db


inner join
dbo.orderstatuses
on
dbo.orders.orderstatus_fk = orderstatuses.orderstatus_pk
INNER JOIN
db

ON
db


INNER JOIN
OrderDetails
ON
Orders.Order_Pk = Order_Fk
WHERE
(db

AND
(db

AND
(db

AND
pending = 0
GROUP BY
db

db

db

OrderSource,
OrderSourceSite,
OrderSource_Pk,
AvgPerOrder,
Profit,
Total,
PercentProfit
FROM
#Tempadrevenue
ORDER BY
CASE @dir
WHEN ‘desc’ THEN
CASE @col
WHEN ‘ORDERSOURCE’ THEN ORDERSOURCE
WHEN ‘ORDERSOURCESITE’ THEN ORDERSOURCESITE
WHEN ‘ORDERSOURCE_PK’ THEN ORDERSOURCE_PK
WHEN ‘ORDERTOTAL’ THEN ORDERTOTAL
WHEN ‘AvgPerOrder’ THEN AvgPerOrder
WHEN ‘PROFIT’ THEN PROFIT
WHEN ‘TOTAL’ THEN Total
WHEN ‘PercentProfit’ THEN PercentProfit
END
END
DESC,
CASE @dir
WHEN ‘asc’ THEN
CASE @col
WHEN ‘ORDERSOURCE’ THEN ORDERSOURCE
WHEN ‘ORDERSOURCESITE’ THEN ORDERSOURCESITE
WHEN ‘ORDERSOURCE_PK’ THEN ORDERSOURCE_PK
WHEN ‘ORDERTOTAL’ THEN ORDERTOTAL
WHEN ‘AvgPerOrder’ THEN AvgPerOrder
WHEN ‘PROFIT’ THEN PROFIT
WHEN ‘TOTAL’ THEN Total
WHEN ‘PercentProfit’ THEN PercentProfit
END
END
DROP TABLE #tempadrevenue Webmaster
Aquinas and More Catholic Goods
www.aquinasandmore.com
I think it should be more like:
CASE @dir WHEN ‘desc’ THEN
(CASE…. THEN OrderSource DESC
THEN ORDERSOURCESITE DESC
END) The DESC should be inside the CASE along with the column and not outside the CASE. Also, this kind of sorting is best done at the front end where its easier to manage than this maze of nested CASE’s. ***********************
Dinakar Nethi
SQL Server MVP
***********************
http://weblogs.sqlteam.com/dinakar/
… or use dynamic SQL.
]]>