sql - order by and sub-query -
i in trouble basical stored procedure, unfortunately not sql expert, trying sort offers result 2 parameters, @orderby , @sortorder, result sorted on result of sub-query. example:
exec [dbo].[gettest2] @page=0,@limit=150,@orderby=n'networkname',@sortorder=n'asc' it works expected, but
exec [dbo].[gettest2] @page=0,@limit=15,@orderby=n'networkname',@sortorder=n'asc' doesn't works because subquery doesn't return records.
how can sort on entire recordset?
use [mycontext] go set ansi_nulls on go set quoted_identifier on go alter procedure [dbo].[gettest2] @page int = 0, @limit int = 10, @orderby nvarchar(50) = 'offerid', @name nvarchar(100) = null, @sortorder nvarchar(50) = 'asc' begin set nocount on; select * (select row_number() over(order @orderby) rownumber, count(*) over() [total_rows], a.name networkname, o.* offers o left outer join affiliatenetworks on o.networkid = a.id (@name null or o.name '%' + @name + '%' )) paged paged.rownumber > @limit * @page , paged.rownumber <= (@limit * @page) + @limit order case when @sortorder <> 'asc' null when @orderby = 'name' name end asc, case when @sortorder <> 'asc' null when @orderby = 'networkname' networkname end asc, case when @sortorder <> 'desc' null when @orderby = 'name' name end desc, case when @sortorder <> 'desc' null when @orderby = 'networkname' networkname end desc end
you might consider adding sorting within row_number keep paging consistent. wrapped sub-query in cte make little easier read.
alter procedure [dbo].[gettest2] @page int = 0, @limit int = 10, @orderby nvarchar(50) = 'offerid', @name nvarchar(100) = null, @sortorder nvarchar(50) = 'asc' begin set nocount on; ;with paged ( select row_number() on ( order case when @sortorder = 'asc' (case @orderby when = 'name' name when 'networkname' a.name end) end asc, case when @sortorder = 'desc' (case @orderby when = 'name' name when 'networkname' a.name end) end desc) ) rownumber, count(*) over() [total_rows], a.name networkname, o.* offers o left outer join affiliatenetworks on o.networkid = a.id (@name null or o.name '%' + @name + '%' ) ) select * paged rownumber - (@limit * @page) between 1 , @limit order rownumber end go as mentioned in comments, row_number may not best construct paging in later versions of sql server. if using @ least 2012 or higher, can use offset , fetch next paging. query becomes this:
select count(*) over() [total_rows], case @orderby when = 'name' o.name when 'networkname' a.name end sortname, a.name networkname, o.* offers o left outer join affiliatenetworks on o.networkid = a.id (@name null or o.name '%' + @name + '%' ) order case when @sortorder = 'asc' sortname else null end asc, case when @sortorder = 'desc' sortname else null end desc offset (@page * @limit) rows fetch next @limit rows only;
Comments
Post a Comment