0

我正在尝试根据下面的动态数据透视结果创建一个新表。查询本身工作正常。

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 (subquery) 但这不起作用。我收到错误消息“消息 156,级别 15,状态 1,行 416 关键字'DECLARE'附近的语法不正确。消息 102,级别 15,状态 1,行 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 语句。

我花了很多时间试图通过查看以前的问题来解决这个问题,并希望得到任何帮助。谢谢你。

4

1 回答 1

1

以下适用于 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;  
于 2016-05-23T00:52:13.277 回答