2014-01-24 106 views
3

我试图动态地透视表,但无法获得想要的结果。 下面是创建一个表在sql server中有多个列的动态数据透视表

create table Report 
(
deck char(3), 
Jib_in float, 
rev int, 
rev_insight int, 
jib_out float, 
creation int 
) 

insert into Report values 
('A_1',0.345,0,0,1.23,20140212), 
('B_2',0.456,0,4,2.34,20140215), 
('C_3',0.554,0,6,0.45,20140217), 
('D_4',0.231,0,8,7.98,20140222), 
('E_5',0.453,0,0,5.67,20140219), 
('F_6',0.344,0,3,7.23,20140223)' 

到目前为止的代码编写的代码....这枢轴列甲板和jib_in进行,但多数民众赞成它只有两排,即在一个我把聚合函数里面下旋转功能和一个我把里面QUOTENAME()

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX); 
SET @columns = N''; 
SELECT @columns += N', p.' + QUOTENAME(deck) 
FROM (SELECT p.deck FROM dbo.report AS p 
GROUP BY p.deck) AS x; 
SET @sql = N' 
SELECT ' + STUFF(@columns, 1, 2, '') + ' 
FROM 
(
SELECT p.deck, p.jib_in 
FROM dbo.report AS p 
) AS j 
PIVOT 
(
SUM(jib_in) FOR deck IN (' 
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') 
+ ') 
) AS p;'; 
PRINT @sql; 
EXEC sp_executesql @sql; 

我需要所有列pivoted和显示在枢轴表。任何帮助,将不胜感激。我在动态数据透视方面非常新颖。我尝试了很多方法来添加其他列但无济于事! 我知道还有其他的方法,请随时提及是否有任何其他方式来得到这个权利。

+1

请秀你想要的输出 – praveen

+0

这里有一个很好的答案:http://stackoverflow.com/questions/21320447/pivot-dynamically-returned-results-from-join-of-two-tables/21320742#21320742 –

回答

3

请使用(如果你正在整理问题,请改变所有的3 INT数据类型):

静态代码:

SELECT HEADER, [A_1],[B_2],[C_3],[D_4],[E_5],[F_6]   
FROM  
(SELECT DECK,HEADER, VALUE FROM REPORT 
    UNPIVOT  
    ( 
    VALUE FOR HEADER IN ([JIB_IN],[REV],[REV_INSIGHT],[JIB_OUT],[CREATION]) 
    ) UNPIV 
) SRC  
PIVOT  
(
    SUM(VALUE) 
    FOR DECK IN ([A_1],[B_2],[C_3],[D_4],[E_5],[F_6]) 
) PIV 

使用动态SQL:

DECLARE @COLSUNPIVOT AS NVARCHAR(MAX), 
@QUERY AS NVARCHAR(MAX), 
@COLSPIVOT AS NVARCHAR(MAX) 

SELECT @COLSUNPIVOT = STUFF((SELECT ','+QUOTENAME(C.NAME) 
FROM SYS.COLUMNS AS C 
WHERE C.OBJECT_ID = OBJECT_ID('REPORT') AND C.NAME <> 'DECK' 
FOR XML PATH('')), 1, 1, '') 

SELECT @COLSPIVOT = STUFF((SELECT ',' + QUOTENAME(DECK) 
FROM REPORT T FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

SET @QUERY 
= 'SELECT HEADER, '[email protected]+' 
FROM 
(
SELECT DECK,HEADER,VALUE FROM REPORT 
UNPIVOT 
(
    VALUE FOR HEADER IN ('[email protected]+') 
) UNPIV 
) SRC 
PIVOT 
(
SUM(VALUE) 
FOR DECK IN ('[email protected]+') 
) PIV' 

EXEC(@QUERY)