2016-09-20 6 views
0

Ich schreibe eine Abfrage, um laufende Summen einiger Dinge im Laufe der Zeit zu berechnen. Die Zeitinkremente sind in wöchentlichen Buckets (jeden Montag), aber im Laufe der Zeit muss nichts in der Vergangenheit sein. Das bedeutet, dass meine wöchentlichen Eimer schweben und immer in der Zukunft bleiben. Ich habe ein paar Links für die Einrichtung einer PIVOT-Funktion gesehen, aber alle diese Beispiele die Spalten sind feste Werte. Wie bekomme ich meine Abfrageergebnisse als meine Spaltennamen angezeigt?So legen Sie Spalten aus dynamischen Abfrageergebnissen fest

Hier ist mein Code, der ausgibt, was ich brauche, um meine Spaltennamen zu sein. Ich setze das Inkrement auf "1", um nur 4 Ergebnisse zum Testen zu bekommen, aber werde es wahrscheinlich bis zu 12 Monate öffnen.

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

Sie werden eine dynamische Dreh wollen, die eine Dreh mit dynamischem SQL ist. Es gibt viele Beiträge dazu. Hier ist eine, die ich kürzlich für jemanden gemacht habe. http://Stackoverflow.com/a/39513013/6167855 – scsimon

+0

@scsimon danke. Ich werde etwas mehr lesen. brauchte nur einen Breadcrumb auf den richtigen Keywords zu suchen. – Nicho247

+0

Kein Schweiß. Hier ist ein cooles Tutorial/Erklärung. http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/ – scsimon

Antwort

0

Sie müssen dynamisch gehen.

Ihnen fehlen einige wichtige Details. Also ich hoffe, dass dies mit einiger Anleitung helfen wird.

Unten ist eine modifizierte Version einer Antwort von früher heute.

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) 

Gibt die folgende SQL, die ausgeführt werden würde

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

Hallo John - Danke. Ich denke, ich kann es von hier aus herausfinden oder zumindest viele Fortschritte machen. – Nicho247

+0

@ Nicho247 Hätte keinen Zweifel, dass Sie das für Sie arbeiten lassen könnten. –

Verwandte Themen