簡體   English   中英

如何從SQL中的動態樞軸創建固定表?

[英]How to create a fixed table from a dynamic pivot in 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(子查詢)但這沒有用。 我收到錯誤消息“關鍵字'DECLARE'附近的消息156,級別15,狀態1,行416錯誤語法。')'附近的消息102,級別15,狀態1,行432錯誤的語法。”。

我也嘗試過這樣修改此部分:SELECT @columns + = N',p。' + QUOTENAME(COMMON_NAME)INTO sp_pivot FROM(從eBird選擇p.COMMON_NAME,從pBird BY p.COMMON_NAME選擇AS)x;

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

我花了很多時間試圖通過查看以前的問題來解決這個問題,希望能對您有所幫助。 謝謝。

以下內容適用於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;  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM