2014-10-06 5 views
1

Я не могу понять, как функционирует случай, у меня есть таблица, называемая продажами, вот как я ее допрошу, и это небольшой фрагмент вывода, я пытаюсь сделать вызов из SQL книгипорядок сортировки в t-sql

use TSQL2012 
select custid,orderid, shippeddate 
from sales.orders 

Это выход (малая его часть)

85 10248 2006-07-16 00:00:00.000 
79 10249 2006-07-10 00:00:00.000 
34 10250 2006-07-12 00:00:00.000 
80 11069 2008-05-06 00:00:00.000 
44 11070 NULL 
46 11071 NULL 

Так что я должен был сделать это, чтобы получить все строки, где идентификатор клиента (CustID) составляет 20 И для сортировки в порядке возрастания отправленной даты с размещением NULL в конце. Это то, что я пытался сделать:

select orderid, shippeddate 
from sales.orders 
where custid = 20 
order by 
    case when shippeddate is null then shippeddate end desc, 
    case when shippeddate is not null then shippeddate end asc 

Он не возвращает абсолютно ничего, поэтому после того, как я взломал я решил посмотреть в Интернете для решения, и это он:

use TSQL2012 
select orderid, shippeddate 
from sales.orders 
where custid = 20 
order by case 
when shippeddate is null then 1 else 0 end, shippeddate ; 

Что 1 и 0 должны делать? Они неверны/ложны, они не являются порядковыми позициями, как они могут заменить desc соответственно asc? Я довольно новичок в SQL, извините за «объясните мне код cos», я слишком глупый вопрос »

+4

Они просто буквальные целые числа. 1 = 1 и 0 = 0. 1 сортировки после 0. Вы ищете сложность, где ни один не существует. –

+4

1 больше 0, это единственное «волшебство» здесь. Он в основном делит все записи на две группы, в которых «shippeddate is null» записываются последними. –

+0

Все еще немного смущает тот факт, что я могу группировать вещи таким образом, никогда не видел ничего подобного. Спасибо – ExtremeSwat

ответ

3

Вы можете думать о конструкции case when shippeddate is null then 1 else 0 end как производный столбец, который не возвращается клиенту с помощью select список, но используется для сортировки.

Вы можете посмотреть на это так:

select orderid, shippeddate, case when shippeddate is null then 1 else 0 end as [SortCol1] 
from sales.orders 
where custid = 20 
order by SortCol1, shippeddate; 
+0

Спасибо за объяснение. – ExtremeSwat

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