2014-01-24 107 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)