在SQL中将动态日期创建为变量(列名称)

时间:2016-12-18 16:48:34

标签: sql sql-server tsql

首先,我已经阅读了类似的帖子,并阅读了评论,这不是一个理想的解决方案,我得到它,但老板(即客户)希望这样。参数如下(由于各种原因太过奇怪但不能相信我): 1. SQL Server Mgmt Studio 2016 2.无参数或通过或临时表。所有都必须在包含的代码内。

所以我们走了:

我需要创建反映日期的列标题:

1. Current date
2. Most recent quarter end prior to current date
3. Most recent quarter end prior to #2
4. Most recent quarter end prior to #3
5. Most recent quarter end prior to #4
6. Most recent quarter end prior to #5

因此,如果使用今天的日期,我的列名将如下

12/18/2016  9/30/2016  6/30/2016  3/31/2016  12/31/2016 9/30/2015

我可以在SAS中轻松完成,但在SQL中不能满足上述要求。

请使用相同的代码帮助。

谢谢

2 个答案:

答案 0 :(得分:1)

对于真正属于表示层的东西来说,似乎还有很长的路要走。也就是说,请考虑以下因素:

我们假设您为计算字段维护命名约定,例如A *= C。然后我们可以将复杂的查询包装在一些动态SQL中。

就像插图一样,让我们​​假设您当前的查询结果如下所示

enter image description here

在" wrap"之后,结果将如下所示:

enter image description here

代码 - 因为您没有排除动态SQL。

A *= A

如果它有助于可视化,则生成的SQL如下:

[CurrentDay], [QtrMinus1], [QtrMinus2], [QtrMinus3], [QtrMinus4],[QtrMinus5]

答案 1 :(得分:0)

以下是使用动态查询的一种方法

DECLARE @prior_quarters INT = 4,
        @int            INT =1,
        @col_list       VARCHAR(max)=Quotename(CONVERT(VARCHAR(20), Getdate(), 101))

WHILE @int <= @prior_quarters
  BEGIN
      SELECT @col_list += Concat(',', Quotename(CONVERT(VARCHAR(20), Eomonth(Getdate(), ( ( ( ( Month(Getdate()) - 1 ) % 3 ) + 1 ) * -1 ) * @int), 101)))
      SET @int+=1
  END

--SELECT @col_list -- for debugging 

EXEC ('select '+@col_list+' from yourtable')