簡體   English   中英

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

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM