2016-09-07 103 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