2016-09-07 48 views
0

这里有很多关于命名列变量的问题,我不认为这是重复的,因为我想使用计算。计算日期作为列名SQL Server 2008

我想在上个月后列出我的专栏。我希望这个工作:

SELECT isnull(sum(CASE when datepart(mm,rc.datetime) = DATEPART(MONTH, GETDATE()) -1 then 1 else null end),0) AS datename(MM, dateadd(MM, -1, getdate())) 

或可读性:

... AS datename(MM, dateadd(MM, -1, getdate())) 

但是这不,我得到一个不正确的语法错误。这是可以实现的吗?预先感谢您提供的任何帮助。

+3

只能用动态SQL – Squirrel

+0

更改列名动态将会引起许多挑战之路。也许更好地理解你真正想要在这里做什么,我们可以帮助找到更好的解决方案。否则,已发布的动态sql选项应该可以正常工作。 –

+0

另外一个意见是我更喜欢避免日期部分的缩写,但如果您打算使用它们,则应该保持一致。在一些地方你使用MM和其他月份。 http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx –

回答

2

使用动态SQL试试这个,

DECLARE @sql NVARCHAR(max) = '' 

SET @sql = 'SELECT isnull(sum(CASE 
       WHEN datepart(mm, rc.DATETIME) = ' + convert(VARCHAR(10), DATEPART(MONTH, GETDATE())) + ' - 1 
        THEN 1 
       ELSE NULL 
       END), 0) AS ' + datename(MM, dateadd(MM, - 1, getdate())) 

EXEC sp_executesql @sql 
2

按照评论,不仅可以实现使用动态SQL:

DECLARE @sql NVARCHAR(MAX); 
SELECT @sql = N'SELECT isnull(sum(CASE when datepart(mm,rc.datetime) = DATEPART(MONTH, GETDATE()) -1 then 1 else null end),0) AS [' + datename(MM, dateadd(MM, -1, getdate())) +'];' 
EXEC sp_executesql @sql