Как создать фиксированную таблицу из динамического центра в 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 (подзапрос) Но это не сработало. Я получаю сообщения об ошибках: "Сообщение 156, уровень 15, состояние 1, строка 416, неправильный синтаксис рядом с ключевым словом" DECLARE ". Сообщение 102, уровень 15, состояние 1, строка 432, неправильный синтаксис рядом с") "."
Я также попытался изменить этот раздел следующим образом: SELECT @columns += N', p.' + QUOTENAME(COMMON_NAME) INTO sp_pivot FROM(ВЫБЕРИТЕ p.COMMON_NAME FROM eBird AS p GROUP BY p.COMMON_NAME) AS x;
Но я получаю эту ошибку:
Сообщение 194, уровень 15, состояние 1, строка 419 Инструкция SELECT INTO не может содержать инструкцию SELECT, которая присваивает значения переменной.
Я потратил довольно много времени, пытаясь понять это, взглянув на предыдущие вопросы, и был бы признателен за любую помощь. Спасибо.
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;