假设我有一个简单的查询:
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
答案 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
子句中指定表名,因此列别名将生根。