Is it possible for me to do the following in dynamic pivot? The code below basically in the first select put the 'result' value for each month into the 'Value' field in the temp table #ValueBucket. The select statement does the same thing, except it does it for the 'rating' field value. The next two select statements follow the same logic except it populates the temp table with the year to date Result and Rating values.
I populated this temp table with these fields values, so that down in my pivot I would be able to just pivot on one field(Value) versus having to join on multiple pivot. This seems to be working fine for me now. I was just interested in if it was possible for me to code the pivot dynamically?
Current Code:
BEGIN ----------------------------------- -- Get Result Values -- ----------------------------------- Select EmployeeID ,Employee ,EmpGroupID ,PA ,EmpLevel ,ObjectiveName as Objective ,Objectiveid as Objectiveid ,Weighting ,ReportingYear ,CASE max(MONTH(r.startdate)) WHEN 1 THEN 'January_Result' WHEN 2 THEN 'February_Result' WHEN 3 THEN 'March_Result' WHEN 4 THEN 'April_Result' WHEN 5 THEN 'May_Result' WHEN 6 THEN 'June_Result' WHEN 7 THEN 'July_Result' WHEN 8 THEN 'August_Result' WHEN 9 THEN 'September_Result' WHEN 10 THEN 'October_Result' WHEN 11 THEN 'November_Result' WHEN 12 THEN 'December_Result' END as [StartMonth] ,MAX([Result]) as Value into #ValueBucket From #tblResults R INNER JOIN @Emphist h ON r.Empgroupid = h.Groupid LEFT OUTER JOIN Config.tblRatingDescription rt ON r.Rating = rt.RatingID LEFT OUTER JOIN Config.tblRatingDescription rtovr ON r.RatingOverride = rtovr.RatingID WHERE r.startdate BETWEEN '2012-01-01' AND '2012-05-01' AND r.datetype IN ('M','Y') GROUP BY EmployeeID, Employee, EmpGroupID, PA, EmpLevel, ObjectiveName, Objectiveid, ReportingYear, Weighting ----------------------------------- -- Get rating values -- ----------------------------------- Insert Into #ValueBucket(EmployeeID,Employee,EmpGroupID,PA,EmpLevel,Objective,Objectiveid,Weighting,ReportingYear,StartMonth,Value) Select EmployeeID ,Employee ,EmpGroupID ,PA ,EmpLevel ,ObjectiveName as Objective ,Objectiveid as Objectiveid ,Weighting ,ReportingYear ,CASE max(MONTH(r.startdate)) WHEN 1 THEN 'January_Rating' WHEN 2 THEN 'February_Rating' WHEN 3 THEN 'March_Rating' WHEN 4 THEN 'April_Rating' WHEN 5 THEN 'May_Rating' WHEN 6 THEN 'June_Rating' WHEN 7 THEN 'July_Rating' WHEN 8 THEN 'August_Rating' WHEN 9 THEN 'September_Rating' WHEN 10 THEN 'October_Rating' WHEN 11 THEN 'November_Rating' WHEN 12 THEN 'December_Rating' END as [StartMonth] ,MAX([Rating]) as Value From #tblResults R INNER JOIN @Emphist h ON r.Empgroupid = h.Groupid LEFT OUTER JOIN Config.tblRatingDescription rt ON r.Rating = rt.RatingID LEFT OUTER JOIN Config.tblRatingDescription rtovr ON r.RatingOverride = rtovr.RatingID WHERE r.startdate BETWEEN '2012-01-01' AND '2012-05-01' AND r.datetype IN ('M','Y') GROUP BY EmployeeID, Employee, EmpGroupID, PA, EmpLevel, ObjectiveName, Objectiveid, ReportingYear, Weighting ----------------------------------- -- Get Result YTD values -- ----------------------------------- Insert Into #ValueBucket(EmployeeID,Employee,EmpGroupID,PA,EmpLevel,Objective,Objectiveid,Weighting,ReportingYear,StartMonth,Value) Select EmployeeID ,Employee ,EmpGroupID ,PA ,EmpLevel ,ObjectiveName as Objective ,Objectiveid as Objectiveid ,Weighting ,ReportingYear ,max(Case When r.DateType = 'Y' and Month(r.StartDate) = 1 AND r.result IS NOT NULL Then 'Result_YTD_13' end) as [StartMonth] ,max(Case When r.DateType = 'Y' and Month(r.StartDate) = 1 AND r.result IS NOT NULL Then r.Result When r.DateType = 'Y' and Month(r.StartDate) = 1 AND r.result IS NULL AND r.rating is NOT NULL THEN COALESCE(rtovr.ratingShortDesc,rt.ratingShortDesc) Else null END) as Value From #tblResults R INNER JOIN @Emphist h ON r.Empgroupid = h.Groupid LEFT OUTER JOIN Config.tblRatingDescription rt ON r.Rating = rt.RatingID LEFT OUTER JOIN Config.tblRatingDescription rtovr ON r.RatingOverride = rtovr.RatingID WHERE r.startdate BETWEEN '2012-01-01' AND '2012-05-01' AND r.datetype IN ('M','Y') GROUP BY EmployeeID, Employee, EmpGroupID, PA, EmpLevel, ObjectiveName, Objectiveid, ReportingYear, Weighting ----------------------------------- -- Get Rating YTD values -- ----------------------------------- Insert Into #ValueBucket(EmployeeID,Employee,EmpGroupID,PA,EmpLevel,Objective,Objectiveid,Weighting,ReportingYear,StartMonth,Value) Select EmployeeID ,Employee ,EmpGroupID ,PA ,EmpLevel ,ObjectiveName as Objective ,Objectiveid as Objectiveid ,Weighting ,ReportingYear ,max(Case When r.DateType = 'Y' and Month(r.StartDate) = 1 Then 'Rating_YTD_13' end) as [StartMonth] ,max(Case When r.DateType = 'Y' and Month(r.StartDate) = 1 Then dbo.udfGetRating(case when r.RatingOverride is null then r.Rating else r.RatingOverride end ) + '|' + CAST(UserOverride AS CHAR(1)) + '|' + rt.ratingShortDesc Else null END ) as Value From #tblResults R INNER JOIN @Emphist h ON r.Empgroupid = h.Groupid LEFT OUTER JOIN Config.tblRatingDescription rt ON r.Rating = rt.RatingID LEFT OUTER JOIN Config.tblRatingDescription rtovr ON r.RatingOverride = rtovr.RatingID WHERE r.startdate BETWEEN '2012-01-01' AND '2012-05-01' AND r.datetype IN ('M','Y') GROUP BY EmployeeID, Employee, EmpGroupID, PA, EmpLevel, ObjectiveName, Objectiveid, ReportingYear, Weighting --------------------------------- -- Pivot -- ----------------------------------- Select * From ( Select v.EmployeeID ,v.Employee ,v.EmpGroupID ,v.PA ,v.EmpLevel ,v.Objective as Objective ,v.Objectiveid as Objectiveid ,v.Weighting ,v.ReportingYear ,v.StartMonth ,v.Value From #ValueBucket v ) TableDate PIVOT ( MAX(Value) FOR [StartMonth] in(January_Result,January_Rating,February_Result,February_Rating,March_Result,March_Rating,April_Result,April_Rating, May_Result,May_Rating,June_Result,June_Rating,July_Result,July_Rating,August_Result,August_Rating,September_Result,September_Rating, October_Result,October_Rating,November_Result,November_Rating,December_Result, December_Rating,Result_YTD_13,Rating_YTD_13 ) )PivotTable END