Создать таблицу на SQL Server из динамических сводных результатов

Есть ли способ напрямую сохранить результаты динамического сводного запроса в фиксированную таблицу? Поскольку результат является динамическим, я не могу создать таблицу, указав имена столбцов и методы, такие как «создать таблицу MyTable as (оператор выбора сводной таблицы)», похоже, не работают на сервере SQL («Неправильный синтаксис рядом с ключевым словом «AS»). Я попытался отформатировать приведенный ниже SQL, чтобы получить структуру SELECT-INTO-FROM, но мне это не удалось. Любая помощь, очевидно, очень ценится!

SQL, используемый для разворота (создайте благодаря этому замечательному веб-сайту!):

declare @pivot varchar(max), @sql varchar(max)
create table pivot_columns (pivot_column varchar(100))

insert into pivot_columns
select distinct DateField from MyTable order by 1

select @pivot=coalesce(@pivot+',','')+'['+pivot_column+']'from pivot_columns

set @sql = 'SELECT * FROM (select DateField, RefCode, SumField from MyTable) p
PIVOT
(sum(SumField) FOR DateField IN  ( ' + @pivot + ') ) 
AS pvl'

drop table pivot_columns

exec (@sql)

person Daan    schedule 06.06.2012    source источник
comment
Вы пробовали PRINTing @sql вместо/перед его выполнением? Как выглядит построенный скрипт?   -  person Andriy M    schedule 06.06.2012
comment
Привет, Андрей, у меня есть, но из-за этого тоже не заработало. Это: SELECT * FROM (выберите DateField, RefCode, SumField из MyTable) p PIVOT (sum(SumField) FOR DateField IN ([20110810],[20110815],...,[20110906],[20110907])) AS pvl   -  person Daan    schedule 06.06.2012
comment
А сам стержень работает нормально, показывает мне, что я хочу. Я просто хочу сохранить результаты в таблице для дальнейшего редактирования/объединения с другими результатами сводной таблицы. И поскольку это задача, которая в какой-то момент должна выполняться автоматически, я не хочу сначала создавать таблицу вручную, а затем использовать вставку.   -  person Daan    schedule 06.06.2012


Ответы (1)


Если я не понимаю, что вы пытаетесь сделать, вы должны иметь возможность добавить INTO mynewTable в свой sql, который вы собираетесь выполнить, и вы должны получить новую таблицу.

declare @pivot varchar(max), @sql varchar(max)
create table pivot_columns (pivot_column varchar(100))

insert into pivot_columns
select distinct DateField from MyTable order by 1

select @pivot=coalesce(@pivot+',','')+'['+pivot_column+']'from pivot_columns

set @sql = 'SELECT * INTO mynewTable FROM (select DateField, RefCode, SumField from MyTable) p
PIVOT
(sum(SumField) FOR DateField IN  ( ' + @pivot + ') ) 
AS pvl'

drop table pivot_columns

exec (@sql)

Я просто тестирую создание новой таблицы в следующем скрипте, и он дает мне новую таблицу, которая находится в БД для использования:

create table t
( 
    [month] int, 
    [id] nvarchar(20), 
    [cnt] int 
)

insert t values (4,'TOTAL',214)
insert t values (5,'TOTAL',23)
insert t values (6,'TOTAL',23)
insert t values (4,'FUNC',47)
insert t values (5,'FUNC',5)
insert t values (6,'FUNC',5)
insert t values (4,'INDIL',167)
insert t values (5,'INDIL',18)
insert t values (6,'INDIL',18)


DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(month) 
            FROM t 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT *
            INTO tabletest from 
            (
                select month, id, cnt
                from t
           ) x
            pivot 
            (
                 sum(cnt)
                for month in (' + @cols + ')
            ) p '


execute(@query)

drop table t
person Taryn    schedule 06.06.2012
comment
Привет Синеногий. Большое спасибо! Я не понимаю, почему я боролся часами, но это именно то, что я имел в виду, и в конце концов так просто. - person Daan; 07.06.2012
comment
Я придумал для себя динамический сводной запрос, но не смог найти эффективный способ выгрузить его в пригодную для использования таблицу. Конечно, это было так просто! Дох!!!! - person jaredbaszler; 09.10.2016