如何在SQL中的计算字段上使用order by?

Rah*_*jee 1 sql t-sql select sql-order-by sql-server-2008

如何在SQL中的计算字段上使用order by?

select a.Customer
    ,a.PlanTo
    ,a.Dollar01
    ,a.Dollar02
    ,a.Dollar03
    ,a.Dollar04
    ,a.Dollar05
    ,a.Dollar06
    ,a.Dollar07
    ,a.Dollar08
    ,a.Dollar09
    ,a.Dollar10
    ,a.Dollar11
    ,a.Dollar12
    ,(CAST(a.Dollar01 as decimal) + CAST(a.Dollar02 as decimal) 
    + CAST(a.Dollar03 as decimal) + CAST(a.Dollar04 as decimal) 
    + CAST(a.Dollar05 as decimal) + CAST(a.Dollar06 as decimal) 
    + CAST(a.Dollar07 as decimal) + CAST(a.Dollar08 as decimal) 
    + CAST(a.Dollar09 as decimal) + CAST(a.Dollar10 as decimal) 
    + CAST(a.Dollar11 as decimal) + CAST(a.Dollar12 as decimal)) as TOTAL1
from MDM_STAT.sds.SMarginText a
where a.salesyear = '2016'
order by a.total1
Run Code Online (Sandbox Code Playgroud)

这给了我'Total1'列不存在,但正如你所见,我创建了它并且如果我没有使用该order by子句,它正在工作.

Bac*_*its 7

你可以做Mureinik建议的并使用序数符号ORDER BY 13,意思是"按第13列排序".不过,我会倾向于避免它,因为它很难告诉你什么打算,如果你回来以后订购的.此外,如果您需要添加列或更改顺序,则必须记住更新ORDER BY子句.这很容易错过.

正如其他人在评论中提到的那样,可以使用您在ORDER BY中指定的别名.但是,因为它是一个列别名,所以没有什么可以完全符合条件. a.TOTAL1没有任何意义.你必须ORDER BY TOTAL1:

select a.Customer
    ,a.PlanTo
    ,a.Dollar01
    ,a.Dollar02
    ,a.Dollar03
    ,a.Dollar04
    ,a.Dollar05
    ,a.Dollar06
    ,a.Dollar07
    ,a.Dollar08
    ,a.Dollar09
    ,a.Dollar10
    ,a.Dollar11
    ,a.Dollar12
    ,(CAST(a.Dollar01 as decimal) + CAST(a.Dollar02 as decimal) 
    + CAST(a.Dollar03 as decimal) + CAST(a.Dollar04 as decimal) 
    + CAST(a.Dollar05 as decimal) + CAST(a.Dollar06 as decimal) 
    + CAST(a.Dollar07 as decimal) + CAST(a.Dollar08 as decimal) 
    + CAST(a.Dollar09 as decimal) + CAST(a.Dollar10 as decimal) 
    + CAST(a.Dollar11 as decimal) + CAST(a.Dollar12 as decimal)) as TOTAL1
from MDM_STAT.sds.SMarginText a
where a.salesyear = '2016'
order by total1
Run Code Online (Sandbox Code Playgroud)

这是因为查询解决顺序.SELECT之后解决ORDER BY,不像在SELECT之前解决的WHERE或FROM,因此不能引用SQL Server中的列别名.

如果列别名与表中的列具有相同的名称,则可能会造成混淆或模糊,因此您需要了解这一点.


sst*_*tan 5

将 Aaron Bertrand 的评论发布为社区 wiki,因为我认为这是最直接的答案:

a.total1不存在,因为 SQL Server 将在 中查找该列SMarginText,但ORDER BY TOTAL1;可以正常工作。