Сводная таблица Dynami c по месяцам - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь создать сводную таблицу Dynami c в SQL, которая будет составлять отчеты по месяцам и годам. Я провел кучу исследований и смог придумать следующий запрос:

declare @dynamic nvarchar(max),
@column nvarchar(max);

set @column = N'';
select @column += N'' + datename(month,incurdate) +' '+ datename(year,incurdate) + ',' 
from (select distinct a.incurdate from artable a) as Transpose

select @column = substring(@column,0,len(@column))

set @dynamic = 'select * from
 (
select month, incurdate, dolamount
from artable join dolentry on month = period
) b
pivot(sum(dolamount) for incurdate in (' + @column + ')) as PivotTable'

execute sp_executesql @dynamic

Я могу успешно распечатать переменную @column, но проблемы возникают, когда я пытаюсь установить ее в @ Dynami c переменная. Сообщение об ошибке: « Сообщение 102, уровень 15, состояние 1, строка 6. Неверный синтаксис рядом с« 1990 ». '1990 - это первый год первого поворотного столбца. Любая помощь или советы приветствуются. Спасибо!

1 Ответ

2 голосов
/ 04 августа 2020

Вам необходимо использовать QUOTENAME в следующем коде:

select @column += N'' + QUOTENAME(datename(month,incurdate) +' '+ datename(year,incurdate)) + ',' 
from (select distinct a.incurdate from artable a) as Transpose

, чтобы получить такой вывод:

[col01], [col02], [col03], ... , [col04]

Как видно из документы , синтаксис PIVOT требует, чтобы столбцы поворота были заключены в квадратные скобки:

SELECT <non-pivoted column>,  
    [first pivoted column] AS <column name>,  
    [second pivoted column] AS <column name>,  
    ...  
    [last pivoted column] AS <column name>  
FROM  
    (<SELECT query that produces the data>)   
    AS <alias for the source query>  
PIVOT  
(  
    <aggregation function>(<column being aggregated>)  
FOR   
[<column that contains the values that will become column headers>]   
    IN ( [first pivoted column], [second pivoted column],  
    ... [last pivoted column])  
) AS <alias for the pivot table>  
<optional ORDER BY clause>;  
...