2012-06-27 6 views
0

Следующий запрос выполняется хорошо ...Dynamic Pivot Query

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

и результат выглядит,

LIC PF 
900.00 NULL 
NULL 600.00 

Но мои сомнения в том, как я могу получить динамические значения поля в колонке ..

что,

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

, как использовать вышеуказанный запрос

+0

вы не можете. список значений статический – teran

+0

@Gaurav Любая обратная связь? Был ли мой ответ полезным? – fancyPants

+0

@tombom ya уверен, что ваш ответ велик, и он отлично работает ... Спасибо, чувак ... –

ответ

2

Чтобы иметь динамику PIVOT, вы должны написать хранимую процедуру.

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) 

Тогда вы можете назвать это так:

EXEC dynPivot 'SELECT * FROM tbl_DeductionHead', 'DeductionHead', 'SUM(DeductionPerAmount)';