是按实际列还是别名完成订购?

时间:2016-11-01 13:44:53

标签: sql-server tsql

假设我有一个简单的查询:

select 
    subgroup,
    subgroup + ' (' + cast(grade as varchar(1)) + 'G)' as grade, 
    count(*) as 'count' 
From table_empl 
where year(EnterDate) = year(getdate())  
group by subgroup, grade  
order by grade  

似乎order by grade按别名grade而非实际列grade;排序,至少结果如下所示。

这是对的吗?

由于我无法更改结果中包含的列,是否为实际列添加别名?像这样的东西?

select 
    grade as 'grade2', 
    subgroup,
    subgroup + ' (' + cast(grade as varchar(1)) + 'G)' as grade,
    count(*) as 'count'
From table_empl 
where year(EnterDate) = year(getdate())  
group by subgroup,grade  
order by grade2

3 个答案:

答案 0 :(得分:4)

如果在FROM子句中为列名添加其表名(或ORDER BY子句中的表的别名),则它将使用列,而不是计算表达式在SELECT子句中,并且与列名称相同。

因此,应使用原始的grade列进行排序:

select 
    subgroup,
    subgroup + ' (' + cast(grade as varchar(1)) + 'G)' as grade, 
    count(*) as 'count' 
From table_empl 
where year(EnterDate) = year(getdate())  
group by subgroup, grade  
order by table_empl.grade

或者:

select 
    subgroup,
    subgroup + ' (' + cast(grade as varchar(1)) + 'G)' as grade, 
    count(*) as 'count' 
From table_empl t
where year(EnterDate) = year(getdate())  
group by subgroup, grade  
order by t.grade

答案 1 :(得分:2)

指令顺序在所有指令后运行,甚至选择。在这种情况下,使用别名而不是实际列是正确的。

条款按以下顺序处理:

FROM
WHERE
GROUP BY
HAVING
SELECT
ORDER BY

您可以使用表的名称(别名)来指定表格列

答案 2 :(得分:0)

一个非常好的问题。显然,official documentation并没有直接回答它。但是,可以从以下事实暗示观察到的行为:列别名和列之间的区别在于后者可以以其父表名(别名)作为前缀,而前者不能。(/ p>

由于您没有在ORDER BY子句中指定表名,因此列别名将生根。