2013-06-28 6 views
0

Я написал следующий сценарий, чтобы имитировать входящие параметры из данных и попытаться отфильтровать результаты с использованием параметров. Все работает отлично, за исключением порядка. В основном это только заказы по номеру и не учитывает утверждение дела, которое обеспечивает второй порядок по столбцу.Обработка SQL Server для данных jquery datatables по выпуску?

declare @sSortColumn as nvarchar(50)='Country'; 
declare @sSortDirection as nvarchar(5) = 'Desc'; 
declare @sSearch as nvarchar(50) = ''; 
declare @iDisplayLength as int = 20; 
declare @iDisplayStart as int = 20; 
declare @sIDsearch as int = CASE WHEN ISNUMERIC(@sSearch) = 1 THEN CAST(@sSearch AS INT) ELSE 0 END; 

WITH media AS 
(
    select ROW_NUMBER() OVER (ORDER BY mc.id) as RowNumber, 
    mc.id,mc.Name, mc.CityID,lc.Name as Country 
    from Lookup_MediaChannels mc 
    left join Lookup_SonarMediaTypes st on mc.SonarMediaTypeID = st.ID 
    left join Lookup_SonarMediaGroups sg on sg.ID = st.SonarMediaGroupID 
    left join Lookup_MediaTypes mt on mc.MediaTypeID = mt.ID 
    left join Lookup_SonarMediaGroups sg1 on sg1.ID = mt.MediaGroupID 
    left join lookup_Countries lc on lc.id = mc.countryid 
    where mc.Name like '%'[email protected]+'%' 
    and (sg1.ID=1 or sg.ID =1) 
    or mc.id = @sIDsearch 
) 

SELECT RowNumber, Name, Country 
FROM media 
WHERE RowNumber BETWEEN (@iDisplayStart+ 1) AND (@iDisplayStart+ @iDisplayLength) 

order by rownumber, 

CASE WHEN @sSortColumn = 'Name' AND @sSortDirection = 'Desc' 
THEN Name END DESC, 

CASE WHEN @sSortColumn = 'Name' AND @sSortDirection != 'Desc' 
THEN Name END, 

CASE WHEN @sSortColumn = 'Country' AND @sSortDirection = 'Desc' 
THEN Country END DESC, 

CASE WHEN @sSortColumn = 'Country' AND @sSortDirection != 'Desc' 
THEN Country END 
+0

Может быть, вы хотите, чтобы упорядочить по сортировать по высказываниям случае первый затем RowNumber? похоже, что рядовой номер будет уникальным для каждого имени. –

+0

номер строки должен быть отсортирован первым, потому что он используется для извлечения диапазона элементов между двумя числами «WHERE RowNumber BETWEEN (@ iDisplayStart + 1) AND (@ iDisplayStart + @iDisplayLength)» – Xerxes

+0

, если у вас есть данные row_num | name 1 | TV 2 | Радио, то, если вы сначала закажете по номеру строки, заказ по имени второй не будет иметь никакого эффекта, у вас всегда будет телевизор перед радио, потому что row_num 1 приходит до 2 –

ответ

1

Этот упрощенный пример может помочь вам

http://sqlfiddle.com/#!6/35ffb/10

Настройка некоторых фиктивных данных (это было бы заменить вашего оператора выбора)

create table x(
    id int, 
    name varchar(3), 
    country varchar(2) 
) 
insert into x 
values (1,'aaa','uk'), 
(2,'aaa','us'), 
(3,'baa','uk'), 
(4,'caa','uk'), 
(5,'baa','it') 

Некоторые ВАР, чтобы держать сортировки поле и порядок сортировки

declare @so char(1) 
declare @sf char(1) 
set @so = 'a' -- a = asc d = desc 
set @sf = 'n' -- n = name c = country 

и выберите для возврата отсортированных данных

SELECT row_number() 
    OVER (order by 
      CASE WHEN @so = 'd' THEN sf END desc, 
      CASE WHEN @so <> 'd' THEN sf end, 
      id 
     ) AS aa, name,country 
    FROM (
    SELECT x.*, case @sf when 'n' then name when 'c' then country end sf 
    FROM X 
) X