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

时间:2016-08-03 17:11:39

标签: sql sql-server-2008 tsql select sql-order-by

如何在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

这给了我' Total1'列不存在,但正如您所见,我创建了它,并且如果我没有使用order by子句,则表现正常。

3 个答案:

答案 0 :(得分:5)

您可以执行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

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

如果您的列别名与表中的列具有相同的名称,则可能会造成混淆或不明确,因此您需要注意这一点。

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

最简单的方法是使用选择列表中的列号而不是其名称:A