2016-03-04 144 views
1

我知道如何動態透視顯示,例如,here非聚合的動態數據透視

動態支點在我的情況,可能無法正常工作,其中#source可以包含動態列和動態列的值,它具有如下指示擺動:

IF OBJECT_ID('tempdb..#Source') IS NOT NULL DROP TABLE #Source 
IF OBJECT_ID('tempdb..#Aim') IS NOT NULL DROP TABLE #Aim 

CREATE TABLE #Source 
(
    ColumnName NVARCHAR(10), 
    ColumnValue NVARCHAR(10), 
    Id INT 
) 

CREATE TABLE #Aim 
(
    Id INT, 
    Column1 NVARCHAR(10), 
    Column2 NVARCHAR(10), 
    Column3 NVARCHAR(10) 
) 

INSERT INTO #Source (ColumnName, ColumnValue, Id) VALUES ('Column1', 'Value1', 1); 
INSERT INTO #Source (ColumnName, ColumnValue, Id) VALUES ('Column2', 'Value1', 1); 
INSERT INTO #Source (ColumnName, ColumnValue, Id) VALUES ('Column1', 'Value2', 2); 
INSERT INTO #Source (ColumnName, ColumnValue, Id) VALUES ('Column1', 'Value4', 3); 
INSERT INTO #Source (ColumnName, ColumnValue, Id) VALUES ('Column3', 'Value1', 3); 
INSERT INTO #Source (ColumnName, ColumnValue, Id) VALUES ('Column3', 'Value3', 4); 

SELECT * FROM #Source 

INSERT INTO #Aim (Id, Column1, Column2, Column3) VALUES (1, 'Value1', 'Value1', NULL) 
INSERT INTO #Aim (Id, Column1, Column2, Column3) VALUES (2, 'Value2', NULL, NULL) 
INSERT INTO #Aim (Id, Column1, Column2, Column3) VALUES (3, 'Value4', NULL, 'Value1') 
INSERT INTO #Aim (Id, Column1, Column2, Column3) VALUES (4, NULL, NULL, 'Value3') 

SELECT * FROM #Aim 

我想達到的輸出#Aim的最後選擇語句。我希望這是自我解釋。這可能嗎?

https://www.mssqltips.com/sqlservertip/2783/script-to-create-dynamic-pivot-queries-in-sql-server/

回答

2

你可以做到這一點

DECLARE @col_list VARCHAR(max) = (SELECT Quotename(ColumnName) + ',' 
    FROM #Source 
    GROUP BY ColumnName 
    ORDER BY ColumnName 
    FOR xml path('')) -- To create the dynamic column list 

SET @col_list = LEFT(@col_list, Len(@col_list) - 1) -- To remove the leading comma 

DECLARE @sql NVARCHAR(max) 

SELECT @sql = 'select * from #Source 
pivot (max(ColumnValue) for ColumnName in (' 
       + @col_list + '))pv' 

EXEC Sp_executesql @sql -- Execute the dynamic sql 

結果:

╔════╦═════════╦═════════╦═════════╗ 
║ Id ║ Column1 ║ Column2 ║ Column3 ║ 
╠════╬═════════╬═════════╬═════════╣ 
║ 1 ║ Value1 ║ Value1 ║ NULL ║ 
║ 2 ║ Value2 ║ NULL ║ NULL ║ 
║ 3 ║ Value4 ║ NULL ║ Value1 ║ 
║ 4 ║ NULL ║ NULL ║ Value3 ║ 
╚════╩═════════╩═════════╩═════════╝ 
+0

哇感謝。我試圖使用max,但沒有得到它的工作。謝謝! – cs0815

+0

我已經添加了一個後續問題:http://stackoverflow.com/questions/35803654/add-dynamic-placeholder-columns-to-dynamically-pivoted-data - 任何輸入將非常讚賞。 – cs0815

+0

@csetzkorn - 增加了解決方案 –