在t-sql中按顺序排序

时间:2014-10-06 09:53:53

标签: sql sql-server tsql

我无法理解这个案例是如何正常运行的,我有一个名为sales的表,这是我如何查询它,这是输出的一个小片段,我试图从一本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

所以我必须要做的是获取客户ID(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'我太愚蠢的问题”

1 个答案:

答案 0 :(得分:3)

您可以将构造case when shippeddate is null then 1 else 0 end视为派生列,它不会通过选择列表返回给客户端,而是用于排序。

你可以这样看:

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;