[英]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
子句,它也可以正常工作。
您可以按照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 BY是在SELECT之后解決的,而WHERE或FROM是在SELECT之前解決的,因此不能在SQL Server中引用列別名。
如果您的列別名與表中的列具有相同的名稱,這可能會造成混淆或模棱兩可,因此您需要意識到這一點。
將Aaron Bertrand的評論發布為社區Wiki,因為我認為這是最直接的答案:
a.total1
不存在,因為SQL Server將在SMarginText
查找該列,但ORDER BY TOTAL1;
會很好。
最簡單的方法是使用選擇列表中的列號代替其名稱: ORDER BY 13
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.