Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 957
RB17 Avatar asked Nov 29 '22 23:11

RB17


2 Answers

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.

like image 194
Bacon Bits Avatar answered Dec 04 '22 09:12

Bacon Bits


Posting Aaron Bertrand's comment as a community wiki, as I think it's the most straight forward answer:

a.total1 doesn't exist, since SQL Server will look for that column in SMarginText , but ORDER BY TOTAL1; would work just fine.

like image 24
sstan Avatar answered Dec 04 '22 07:12

sstan