如何在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
子句,则表现正常。
答案 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
。