2012-06-27 61 views
0

下面的查询执行好...动态透视查询

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你确定你的答案是伟大的,它工作正常...感谢家伙... –

回答

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)';