2016-08-03 50 views
0

如何使用SQL中的計算字段排序?如何使用SQL中計算字段的順序?

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 

這是給我的「共1」列不存在,但你看,我已經創造了它,如果我不使用order by子句工作。

+1

刪除別名'a.' - 嘗試'按total1'排序... – sgeddes

+1

'a.total1'不存在,因爲SQL Server將在'SMarginText'中查找該列,但'ORDER BY TOTAL1 ;'會工作得很好。 –

+0

(1)格式化你的代碼和(2)澄清(標記)你實際使用的DBMS是PostgreSQL還是SQL Server? – Nicarus

回答

3

你可以做什麼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中的列別名。

如果您的列別名與表中的列名稱相同,那麼這可能會讓您感到困惑或模棱兩可,因此您需要注意這一點。

+0

感謝您的解釋。這對了解條款如何工作非常有幫助。欣賞它。 –

+0

@RahulBanerjee知道訂單查詢被執行是有幫助的。 [這裏](http://stackoverflow.com/a/17403990/696808)更詳細的,如果你有興趣。 –

1

最簡單的方法是在選擇列表中使用列號而不是名稱:ORDER BY 13

+2

[這樣一個可怕的想法推薦,特別是對於生產代碼,因爲序號非常脆弱](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/06/bad-habits-到開球順序逐個ordinal.aspx)。在其他消息中,洗碗的最簡單方法是扔掉它們併購買新的。 (「最簡單」和「最好」很少重合。) –

2

發佈爲社區維基阿龍貝特朗的評論,因爲我認爲這是最直截了當的回答:

a.total1不存在,因爲SQL Server將尋找那些列在SMarginText,但ORDER BY TOTAL1;會工作得很好。