如何从动态查询结果中设置列

时间:2016-09-20 18:31:46

标签: sql-server pivot

我正在编写一个查询来计算一些事情随时间推移的总计。时间增量是每周一次(每个星期一),但随着时间的推移,过去不需要任何事情。这意味着我的每周水桶将会浮动,并始终保持在未来。我已经看到了一些关于如何设置PIVOT函数的链接,但是所有这些示例中的列都是固定值。如何将查询结果显示为列名?

这是我的代码输出我需要的列名。我将增量设置为“1”以获得仅4个测试结果,但可能会将其打开长达12个月。

DECLARE @Startdate as date
DECLARE @Enddate as date

SET @Startdate = getdate()
SET @Enddate = DATEADD(Month,1,@StartDate)

;WITH cte(myDate) AS (  SELECT CASE WHEN DATEPART(Day,@StartDate) = 1 THEN @StartDate 
                        ELSE DATEADD(Week,DATEDIFF(Week,0,@StartDate)+1,0) END AS myDate
                        UNION ALL
                        SELECT DATEADD(Week,1,myDate)
                        FROM cte
                        WHERE DATEADD(Week,1,myDate) <=  @EndDate )

SELECT CONVERT(date,myDate) AS BuildWeek
FROM cte
OPTION (MAXRECURSION 0)

1 个答案:

答案 0 :(得分:0)

你必须充满活力。

您缺少一些重要细节。所以我希望这会有所帮助。

以下是今天早些时候的答案的修改版本。

Declare @Startdate as date,@Enddate as date
Set @Startdate = getdate()
Set @Enddate   = DATEADD(Month,1,@StartDate)

Declare @SQL varchar(max) = ''
Declare @Col varchar(max) = '
,[Title] = sum(case when Date between ''[DateR1]'' and ''[DateR2]'' then [YourField] else null end)'


;with cte(myDate) as ( 
      Select Case When DatePart(Day,@StartDate) = 1 Then @StartDate Else DateAdd(Week,DateDiff(Week,0,@StartDate)+1,0) end as myDate
      Union All
      Select DateAdd(Week,1,myDate)
       From  cte
       Where  DateAdd(Week,1,myDate) <=  @EndDate 
)
Select @SQL = @SQL + Replace(Replace(Replace(@Col,'[DateR1]',DateR1),'[DateR2]',DateR2),'Title',Title)
 From (Select DateR1 = cast(myDate as Date)
             ,DateR2 = DateAdd(DAY,6,cast(myDate as Date))
             ,Title  = 'Week Of '+Substring(DateName(WEEKDAY,myDate),1,3)+' '+Substring(DateName(MONTH,myDate),1,3)+' '+cast(Day(myDate) as varchar(5))
        From  cte
       ) A 
Set @SQL = 'Select ID'+@SQL+' 
From  YourTable 
Group By ID
'
Print @SQL
--Exec(@SQL)

返回将执行的以下SQL

Select ID
,[Week Of Mon Sep 26] = sum(case when Date between '2016-09-26' and '2016-10-02' then [YourField] else null end)
,[Week Of Mon Oct 3] = sum(case when Date between '2016-10-03' and '2016-10-09' then [YourField] else null end)
,[Week Of Mon Oct 10] = sum(case when Date between '2016-10-10' and '2016-10-16' then [YourField] else null end)
,[Week Of Mon Oct 17] = sum(case when Date between '2016-10-17' and '2016-10-23' then [YourField] else null end) 
From  YourTable 
Group By ID
相关问题