如何消除SELECT子句中的重复表达式?

时间:2015-09-11 19:05:12

标签: sql-server

我的查询如下所示 -

select distinct datepart(yy, a.date_created) as year, datepart(mm, a.date_created) as month, concat(month, '-', year) as monthyr
from dbo.assignment a

所以,我在这里要做的是,我正在获得年份的一部分,然后是月份的一部分日期,然后我需要第三列作为月份。

意思是,当我运行查询时,我应该有三列:
假设我的日期为2015年11月9日

运行此查询时,结果应如下所示:

Year    Month    YearMonth  
2015    09       09-2015 

但是当我运行查询时,我收到错误:

Msg 207, Level 16, State 1, Line 6  
Invalid column name 'month'.  
Msg 207, Level 16, State 1, Line 6  
Invalid column name 'year'.  

我使用以下查询得到了正确的结果:

select distinct datepart(yy, a.date_created) as year, datepart(mm, a.date_created) as month, concat(datepart(mm, a.date_created), '-', datepart(yy, a.date_created)) as monthyr
from dbo.assignment a  

我希望在连接时避免再次使用datepart。所以,我正在尝试做第一次查询之类的事情。

还有其他方法可以达到相同的效果吗?

由于

2 个答案:

答案 0 :(得分:1)

要删除重复的表达式,可以使用派生的查询(select .. from select ..)。否则无法访问同一选择中select输出子句中引入的标识符。

然而,SQL Server应该优化两者并消除“重复”。表达。我相当肯定,即使有明显的移动,它也会制定相同的计划 - 但请查看实际查询计划以确定。

带有派生选择的查询可能如下所示:

select
  year, month, concat(month, '-', year) as monthyr
from (
  select distinct
    datepart(yy, a.date_created) as year,
    datepart(mm, a.date_created) as month
  from dbo.assignment a
  ) t

虽然这可以在某些情况下导致更清晰的查询,但最大的改进可能是添加换行符和缩进。

答案 1 :(得分:1)

子查询会更有效:

select *,concat(month, '-', year) as monthyr
from (
      select distinct datepart(yy, date_created) as year
                     , datepart(mm, date_created) as month
      from dbo.assignment) a