Rahul Banerjee Rahul Banerjee - 4 months ago 15
SQL Question

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

How to use order by on a calculated field in 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


This is giving me 'Total1' column does not exist but as you see I have created it and is working if I am not using the
order by
clause.

Answer

You can do what Mureinik suggests and use the ordinal notation of ORDER BY 13, which means "order by the 13th column." However, I would tend to avoid it because it's difficult to tell what you're intending to order by if you come back later. Also, if you need to add a column or change the order, you have to remember to update the ORDER BY clause. It's easy to miss that.

As others mention in the comments, it is possible to use the alias you specify in the ORDER BY. However, because it's a column alias, there's nothing to fully qualify. a.TOTAL1 doesn't mean anything. You must 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

This works because of the query solve order. ORDER BY is solved after the SELECT, unlike WHERE or FROM which are solved before the SELECT and therefore can't refer to column aliases in SQL Server.

This can be confusing or ambiguous if your column alias has the same name as a column from a table, so you need to be aware of that.