我正在编写一个查询来计算一些事情随时间推移的总计。时间增量是每周一次(每个星期一),但随着时间的推移,过去不需要任何事情。这意味着我的每周水桶将会浮动,并始终保持在未来。我已经看到了一些关于如何设置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)
答案 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