0

The following query is executed well...

select LIC,PF from (select * from tbl_DeductionHead )up
pivot(sum(DeductionPerAmount) for DeductionHead In (LIC,PF)) as pvt

and output looks like,

LIC PF
900.00 NULL 
NULL 600.00

But my doubt is how can i get the dynamic Field Values of Column..

that is ,

select * from (select * from tbl_DeductionHead )up
pivot(sum(DeductionPerAmount) for DeductionHead In (*)) as pvt

how to use the above query

fancyPants
  • 50,732
  • 33
  • 89
  • 96
Gaurav Agrawal
  • 4,355
  • 10
  • 42
  • 61

1 Answers1

2

To have the PIVOT dynamic you have to write a stored procedure.

CREATE PROCEDURE dynPivot 
(
@select varchar(255), 
@pivotColumns varchar(255), 
@summaries varchar(100) 
) AS 

DECLARE @pivot varchar(max), @sql varchar(max), @selectForPivotColumns varchar(max)

SELECT @selectForPivotColumns = REPLACE(@select, 'SELECT', 'SELECT ' + @pivotColumns + ' AS rowValuesToColumns, ')

CREATE TABLE #pivot_columns (pivot_column varchar(100))

SELECT @sql = 'SELECT DISTINCT rowValuesToColumns FROM (' + @selectForPivotColumns + ') as t'

INSERT INTO #pivot_columns
EXEC(@sql)

SELECT @pivot = COALESCE(@pivot + ', ', '') + '[' + pivot_column + ']' FROM #pivot_columns

SELECT @sql = 
'
    SELECT * FROM
    (
        ' + @select + '
    ) AS t
    PIVOT
    (
        ' + @summaries + ' FOR ' + @pivotColumns + ' IN (' + @pivot + ')
    ) AS p
'

EXEC(@sql)

Then you can call it like this:

EXEC dynPivot 'SELECT * FROM tbl_DeductionHead', 'DeductionHead', 'SUM(DeductionPerAmount)';
fancyPants
  • 50,732
  • 33
  • 89
  • 96