2013-10-02 2 views
0

У меня есть предложение ORDER BY, которое упорядочивает результирующий набор сгруппированных значений.SQL Укажите порядок набора результатов ORDER BY

Что я хотел бы иметь ЗАКАЗАТЬ. Чтобы сделать это, в строке No KS2 находится вверху.

Значения условно заполняются из трех разных столбцов, но значения взяты из одного набора во всех трех столбцах.

значения равны нулю, строка нулевой длины, 1c, 1b, 1а, 2в, 2b, 2а, 3в .... 5a, 6c, 6b, 6а

В настоящее время мой ORDER BY статьи выявляет значения упорядочиваются слева от значения и справа от значений DESC.

И пример результирующего набора будет:

2a 
3c 
3b 
4c 
4b 
4a 
5c 
5b 
No KS2 

Вот пример того, что я хотел:

No KS2 
2a 
3c 
3b 
4c 
4b 
4a 
5c 
5b 

код у меня в настоящее время находится здесь:

ORDER BY 
LEFT(
CASE Name 
    WHEN 'English' THEN 
     CASE WHEN [Ks2en]=NULL OR [Ks2en]='' THEN 
      'No KS2' 
     ELSE 
      [Ks2en] 
     END 
    WHEN 'Mathematics' THEN 
     CASE WHEN [Ks2ma]=NULL OR [Ks2ma]='' THEN 
      'No KS2' 
     ELSE 
      [Ks2ma] 
     END 
    ELSE 
     CASE WHEN [Ks2av]=NULL OR [Ks2av]='' THEN 
      'No KS2' 
     ELSE 
      [Ks2av] 
     END 
    END,1), 
RIGHT(
CASE Name 
    WHEN 'English' THEN 
     CASE WHEN [Ks2en]=NULL OR [Ks2en]='' THEN 
      'No KS2' 
     ELSE 
      [Ks2en] 
     END 
    WHEN 'Mathematics' THEN 
     CASE WHEN [Ks2ma]=NULL OR [Ks2ma]='' THEN 
      'No KS2' 
     ELSE 
      [Ks2ma] 
     END 
    ELSE 
     CASE WHEN [Ks2av]=NULL OR [Ks2av]='' THEN 
      'No KS2' 
     ELSE 
      [Ks2av] 
     END 
    END,1) DESC 
+0

так, есть вопрос там где-нибудь? –

+0

Что означает 'No KS2'? – dognose

+2

http://stackoverflow.com/questions/1250156/how-do-return-rows-with-a-specific-value-first -> это должно дать вам некоторую идею – usha

ответ

4

Поместите свой запрос с выводом своего аргумента внутри подзапроса, затем во внешнем запросе проверьте его, чтобы вы могли его заказать сначала (используя константу). Это мешает вам повторить это беспорядочное состояние CASE в ORDER BY (я предполагаю, что то же или подобное также существует в списке SELECT). Это не отображает ваш код в точности (особенно, так как мы не весь код), но должен дать представление:

SELECT Ks2en /* , other columns */ 
FROM 
(
    SELECT Ks2en = CASE WHEN Ks2en = 'x' THEN 'No KS2' ELSE Ks2en END 
    /* , other columns */ 
    FROM ...your query... 
) AS x 
ORDER BY CASE WHEN Ks2en = 'No KS2' THEN 'a' ELSE 'b' END, Ks2en; 

http://sqlfiddle.com/#!3/128df/2

+0

Да и группа. – Matt

+0

@ Matt * what * GROUP BY? –

+0

Его нет в моем примере, но я ссылаюсь на набор результатов, сгруппированный в вопросе. Я доволен вашим ответом, просто нужно пройти секунду, чтобы попробовать. – Matt

-1

В вашем заказе вы можете сделать следующее?

ORDER BY 
    CASE WHEN [Ks2ma]=NULL OR [Ks2ma]='' THEN -1 ELSE [Ks2en] END 

не всегда есть заставить «Нет» KS2 быть значение, которое вы знаете, сортирует выше, чем остальные (на основе набора данных). Это нужно сделать только в ORDER BY

+3

(1) '= NULL' должен быть' IS NULL'. (2) -1 приведет к ошибке преобразования, так как он попытается преобразовать 'Ks2en' в' INT'. Выражение 'CASE' должно сворачиваться к совместимым типам в соответствии с приоритетом типа данных. –

+0

oops - вы правы! Я просто скопировал его дело, не задумываясь. – diaho

Смежные вопросы