Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

Pivot statement with Dynamic SQL and totals columns

Posted on 2010-08-20
3
Medium Priority
?
443 Views
Last Modified: 2012-05-10
The atteached code, supplied by an EE Expert works great.

The data is output as:
rep     January     February     etc
myrep  1000          1250          etc

Question...
Is there a way to add a totals column and if possible an average per month column?

New output desired...
rep     January     February     etc    Totals     AVG
myrep  1000          1250          etc     2250       1125
SELECT  v.rep,    
		Sum(v.[Gross Rev]) as GrossRev,     
		DATENAME(month, v.Funded) as Mth  ,  
		month(v.Funded) as MthI    
Into #temp    
FROM	CRMPROD_01.dbo.v_P_Reporting v    
WHERE	v.Funded is not null     
		and	v.Status <> 'Closed'     
		and	(YEAR(v.Funded) = YEAR(getdate()))     
		and	(MONTH(v.Funded) > MONTH(getdate())-@)    
Group by rep, v.Funded    
ORDER BY v.rep, month(v.Funded)  
  
--Create Dynamic SQl and Pivot   
declare @sql varchar(4000)  
declare @columns varchar(8000)    
  
select @columns = coalesce(@columns+',','') + '[' + Mth + ']'  
from #temp  
group by Mth, MthI  
order by MthI  
   
set @sql = '  
    SELECT [rep], ' + @columns + '  
    FROM    
    (SELECT [rep], [GrossRev], [Mth] as Mth from #temp) src  
     PIVOT  
    (Sum ([GrossRev]) FOR Mth IN (' + @columns + ') ) AS pvt'  
   
EXEC (@sql)  
  
Drop table #temp

Open in new window

0
Comment
Question by:lrbrister
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
3 Comments
 
LVL 58

Accepted Solution

by:
cyberkiwi earned 2000 total points
ID: 33484236

SELECT  v.rep,    
		Sum(v.[Gross Rev]) as GrossRev,     
		DATENAME(month, v.Funded) as Mth  ,  
		month(v.Funded) as MthI    
Into #temp    
FROM	CRMPROD_01.dbo.v_P_Reporting v    
WHERE	v.Funded is not null     
		and	v.Status <> 'Closed'     
		and	(YEAR(v.Funded) = YEAR(getdate()))     
		and	(MONTH(v.Funded) > MONTH(getdate())-@)    
Group by rep, v.Funded    
ORDER BY v.rep, month(v.Funded)  
  
--Create Dynamic SQl and Pivot   
declare @sql varchar(4000)  
declare @columns varchar(8000)    
declare @totals varchar(8000)
declare @averages varchar(8000)
  
select	@columns = coalesce(@columns+',','') + '[' + Mth + ']',
		@totals  = coalesce(@totals+'+','') + 'isnull([' + Mth + '],0)',
		@averages  = coalesce(@averages+'+','') + 'isnull(abs(sign([' + Mth + '])),0)'
from #temp
group by Mth, MthI  
order by MthI

set @sql = '  
    SELECT [rep], ' + @columns +
		',[Total]=' + @totals +
		',[AVG]=1.0*(' + @totals + ')/isnull(nullif(' + @averages + ',0),0)
    FROM    
    (SELECT [rep], [GrossRev], [Mth] as Mth from #temp) src  
     PIVOT  
    (Sum ([GrossRev]) FOR Mth IN (' + @columns + ') ) AS pvt'  
   
EXEC (@sql)  
  
Drop table #temp

Open in new window

0
 

Author Closing Comment

by:lrbrister
ID: 33484287
cyberkiwi
Wonderful...thanks.

If I can ask a quick follow-up...'

If this is in  astored procedure that I'll call from my VB code...is it necessary to have the "drop table #temp" at the end...or will that automatically drop after the SP executes?
0
 
LVL 58

Expert Comment

by:cyberkiwi
ID: 33484382
If this is in an SP, no you don't have to drop it.
0

Featured Post

Will your db performance match your db growth?

In Percona’s white paper “Performance at Scale: Keeping Your Database on Its Toes,” we take a high-level approach to what you need to think about when planning for database scalability.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this article we will learn how to fix  “Cannot install SQL Server 2014 Service Pack 2: Unable to install windows installer msi file” error ?
What if you have to shut down the entire Citrix infrastructure for hardware maintenance, software upgrades or "the unknown"? I developed this plan for "the unknown" and hope that it helps you as well. This article explains how to properly shut down …
Via a live example, show how to setup several different housekeeping processes for a SQL Server.
Viewers will learn how to use the INSERT statement to insert data into their tables. It will also introduce the NULL statement, to show them what happens when no value is giving for any given column.

688 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question