Dynamic SQL - povit table with row total and column total

Q1, Q2, Q3:





Code:

CREATE TABLE #PovitTable
(
RowHeader varchar(15),
ColumnHeader varchar(20),
VariableValue int
)

INSERT INTO #PovitTable VALUES ('North America','Sales','2000000')
INSERT INTO #PovitTable VALUES ('North America','Expenses','1250000')
INSERT INTO #PovitTable VALUES ('North America','Taxes','250000')
INSERT INTO #PovitTable VALUES ('North America','Profit','500000')
INSERT INTO #P

Q1, Q2, Q3:

 

Code:

CREATE TABLE #PovitTable
(
RowHeader varchar(15),
ColumnHeader varchar(20),
VariableValue int
)

INSERT INTO #PovitTable VALUES ('North America','Sales','2000000')
INSERT INTO #PovitTable VALUES ('North America','Expenses','1250000')
INSERT INTO #PovitTable VALUES ('North America','Taxes','250000')
INSERT INTO #PovitTable VALUES ('North America','Profit','500000')
INSERT INTO #PovitTable VALUES ('North America','Profit','200000')
INSERT INTO #PovitTable VALUES ('Europe','Sales','2500000')
INSERT INTO #PovitTable VALUES ('Europe','Expenses','1250000')
INSERT INTO #PovitTable VALUES ('Europe','Taxes','500000')
INSERT INTO #PovitTable VALUES ('Europe','Profit','750000')
INSERT INTO #PovitTable VALUES ('South America','Sales','500000')
INSERT INTO #PovitTable VALUES ('South America','Expenses','250000')
INSERT INTO #PovitTable VALUES ('Asia','Sales','800000')
INSERT INTO #PovitTable VALUES ('Asia','Expenses','350000')
INSERT INTO #PovitTable VALUES ('Asia','Taxes','100000')

--Q1
select * from #PovitTable

DECLARE @ColumnsList VARCHAR(8000)
DECLARE @RowSumList VARCHAR(max)

SELECT @ColumnsList = COALESCE(@ColumnsList + ',' + QUOTENAME(CAST(ColumnHeader as varchar)) , QUOTENAME(CAST(ColumnHeader as varchar)) )
,@RowSumList = COALESCE(@RowSumList + ' + isnull(p.' + QUOTENAME(CAST(ColumnHeader as varchar)) + ',0)',
                         'isnull(p.' + QUOTENAME(CAST(ColumnHeader as varchar))+ ',0)')                   
FROM #PovitTable
GROUP BY ColumnHeader

--Use to calculate Column Sum
select * 
into #PovitTable2
from #PovitTable
update #PovitTable2 set rowHeader = 'Total'

DECLARE @SQLQueryPovit VARCHAR(8000)
SET @SQLQueryPovit = '
SELECT *
FROM #PovitTable
PIVOT
	(
	SUM(VariableValue)
	FOR [ColumnHeader]
	IN (' + @ColumnsList + ')
	)
	AS p1
'

DECLARE @SQLQueryPovitWithTotal VARCHAR(8000)
SET @SQLQueryPovitWithTotal = '
Select *
,Total = ' + @RowSumList +'
from 
(
	SELECT *
	FROM #PovitTable
	PIVOT
		(
		SUM(VariableValue)
		FOR [ColumnHeader]
		IN (' + @ColumnsList + ')
		)
		AS p1
	 
	UNION

	SELECT *
	FROM #PovitTable2
	PIVOT
		(
		SUM(VariableValue)
		FOR [ColumnHeader]
		IN (' + @ColumnsList + ')
		)
		AS p2
) p
'

--Q2
EXECUTE(@SQLQueryPovit)

--Q3
EXECUTE(@SQLQueryPovitWithTotal)

print @SQLQueryPovit
print @SQLQueryPovitWithTotal

--檢查查詢語句
--Checking Query
print ''
print N'111 @ColumnsList				:' + @ColumnsList
print N'111 @RowSumList					:' + @RowSumList
print N'111 @SQLQueryPovit				:' + @SQLQueryPovit
print ''
print N'111 @SQLQueryPovitWithTotal		:' + @SQLQueryPovitWithTotal

DROP TABLE #PovitTable,#PovitTable2

 

 

參考:http://www.tsqltutorials.com/pivot.php

 

 

 

------------------

熱愛生命 喜愛新奇 有趣的事物

 

過去 是無法改變
將來 卻能夠創造

 

希望使大家生活更便利
世界更美好

 

a guy who loves IT and life