2016-09-20 80 views
0

我正在编写一个查询来计算一段时间内的几件事的总计。时间增量以每周桶形式存在(每个星期一),但随着时间的推移,过去不需要任何东西。这意味着我的每周水桶将会漂浮并始终留在将来。我已经看到了一些关于如何设置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

你会想一个动态的支点,这是使用动态SQL枢轴执行。这里有很多帖子。这是我最近为某人做的一个。 http://scackoverflow.com/a/39513013/6167855 – scsimon

+0

@scsimon谢谢。我会做更多的阅读。只需要正确的关键字搜索面包屑。 – Nicho247

+0

没有汗水。这是一个很酷的教程/解释。 http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/ – scsimon

回答

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'[email protected]+' 
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 
+0

嗨,约翰 - 谢谢。我想我可以从这里弄明白,或者至少取得很大进展。 – Nicho247

+0

@ Nicho247毫无疑问,你可以为你做这项工作。 –