我的查询如下所示 -
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。所以,我正在尝试做第一次查询之类的事情。
还有其他方法可以达到相同的效果吗?
由于
答案 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