2016-05-23 110 views
0

我想從下面的動態透視的結果創建一個新表。查詢本身工作正常。如何從SQL中的動態數據透視表創建固定的表格?

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX); 
SET @columns = N''; 
SELECT @columns += N', p.' + QUOTENAME(COMMON_NAME) 
FROM (SELECT p.COMMON_NAME FROM eBird AS p 
GROUP BY p.COMMON_NAME) AS x; 
SET @sql = N' 
SELECT SAMP_EVENT_ID, ' + STUFF(@columns, 1, 2, '') + ' 
FROM 
(SELECT SAMP_EVENT_ID, COMMON_NAME, SUM(IIF(OBS_COUNT IS NULL, 0, 1)) AS  
Pres 
FROM eBird GROUP BY SAMP_EVENT_ID, COMMON_NAME) AS j 
PIVOT 
(SUM(Pres) FOR COMMON_NAME IN (' 
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ')) AS p;'; 
PRINT @sql; 
EXEC sp_executesql @sql; 

我已經試過了典型
SELECT * INTO newtable的FROM(子查詢) 但沒有奏效。我收到錯誤「Msg 156,Level 15,State 1,Line 416 關鍵字'DECLARE'附近語法不正確。Msg 102,Level 15,State 1,Line 432''''附近的語法不正確。

我也嘗試修改此部分,如下所示: SELECT @columns + = N',p。' + QUOTENAME(COMMON_NAME) INTO sp_pivot FROM(SELECT p.COMMON_NAME FROM eBird AS p GROUP BY p.COMMON_NAME)AS x;

但是,我得到這個錯誤:
消息194,級別15,狀態1,行419 SELECT INTO語句不能包含賦值給變量的SELECT語句。

我花了相當多的時間試圖通過查看以前的問題來解決這個問題,並希望得到任何幫助。謝謝。

回答

0

在MS SQL 2014年

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX); 
SET @columns = N''; 
SELECT @columns += N', p.' + QUOTENAME(COMMON_NAME) 
FROM (SELECT p.COMMON_NAME FROM eBird AS p 
GROUP BY p.COMMON_NAME) AS x; 
SET @sql = N' 
SELECT SAMP_EVENT_ID, ' + STUFF(@columns, 1, 2, '') + ' into NewTable 
FROM 
(SELECT SAMP_EVENT_ID, COMMON_NAME, SUM(IIF(OBS_COUNT IS NULL, 0, 1)) AS  
Pres 
FROM eBird GROUP BY SAMP_EVENT_ID, COMMON_NAME) AS j 
PIVOT 
(SUM(Pres) FOR COMMON_NAME IN (' 
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ')) AS p;'; 
PRINT @sql; 
EXEC sp_executesql @sql; 

版本從2008 R2的以下作品的作品:

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX); 
SET @columns = N''; 
SELECT @columns += N', p.' + QUOTENAME(COMMON_NAME) 
FROM (SELECT p.COMMON_NAME FROM eBird AS p 
GROUP BY p.COMMON_NAME) AS x; 
SET @sql = N' 
SELECT SAMP_EVENT_ID, ' + STUFF(@columns, 1, 2, '') + ' into NewTable2 
FROM 
(SELECT SAMP_EVENT_ID, COMMON_NAME, SUM(case when OBS_COUNT is null then 0 else 1 end) AS  
Pres 
FROM eBird GROUP BY SAMP_EVENT_ID, COMMON_NAME) AS j 
PIVOT 
(SUM(Pres) FOR COMMON_NAME IN (' 
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '') + ')) AS p;'; 
PRINT @sql; 
EXEC sp_executesql @sql;