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

How to use order by on a calculated field in SQL?

如何在 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 子句就可以正常工作。

最简单的方法是使用 select 列表中的列编号而不是其名称:ORDER BY 13.

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

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

您可以按照 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

这是因为查询解决顺序。 ORDER BYSELECT 之后解决,不像 WHEREFROMSELECT 之前解决,因此不能引用 [=29 中的列别名=] 服务器.

如果您的列别名与 table 中的列同名,这可能会造成混淆或模棱两可,因此您需要注意这一点。