2015-07-09 3 views
3

Я делаю попытку запустить свой первый динамический стержень в SQL Server 2012.Dynamic поворотного SQL Server 2012

Моего #temp стол, который я использую для динамического поворота выглядит следующим образом.

YearMonth Agreement nr Discount 
------------------------------------ 
201303   123   1 
201303   12   0 
201304   1   0 

Я бегу этот код и он не работает:

сообщение
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 

--Get distinct values of the PIVOT Column 
SELECT @ColumnName = ISNULL(@ColumnName + ',', '') + QUOTENAME(YearMonth) 
FROM (SELECT DISTINCT YearMonth FROM #FINAL) AS Courses 

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
    N'SELECT [Agreement nr],YearMonth , ' + @ColumnName + ' 
    FROM #FINAL 
    PIVOT(
      COUNT(agreement nr) 
      FOR YearMonth IN (' + @ColumnName + ') AS PVTTable' 
--Execute the Dynamic Pivot Query 

EXECUTE @DynamicPivotQuery; 

Ошибка я получаю

FOR YearMonth IN ([201403]) AS PVTTable' is not a valid identifier.

Что я здесь отсутствует?

ответ

1

Причина ошибки в том, что вам не хватает скобки перед тем, как вы сгенерируете Pivot. Более того, но ваш стержень был довольно неэффективным.

Вы должны выбрать, что вам нужно для исходной таблицы в вашем стержне, иначе оно могло бы работать в течение длительного времени и создавать много строк с нулевыми значениями.

Ниже фиксируется и, надеюсь, более эффективным:

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
     + QUOTENAME(YearMonth) 
FROM (SELECT DISTINCT YearMonth FROM #FINAL) AS Courses 

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
    N'SELECT ' + @ColumnName + ' 
    FROM (Select [Agreement nr], YearMonth from #FINAL) src 
    PIVOT(
      COUNT([Agreement nr]) 
      FOR YearMonth IN (' + @ColumnName + ')) AS PVTTable' 
--Execute the Dynamic Pivot Query 

EXECUTE sp_executesql @DynamicPivotQuery; 
+0

Я попробовал решение, и выдает сообщение об ошибке: COUNT (Соглашение пг) ДЛЯ годМесяц В ([201503], [201506], [201504] , [201505])) AS PVTTable 'не является допустимым идентификатором. Может ли это сделать, что GROUP BY необходимо, поскольку мы делаем COUNT и не делаем GROUP BY, содержащую YearMonth? – user3197575

+0

Попробуйте поставить «Соглашение nr» в квадратных скобках тоже: [Соглашение nr] –

+0

Интересно. Я положил скобки вокруг него, и он по-прежнему вызывает ту же ошибку: Msg 203, Level 16, State 2, Line 20 Название «SELECT [Соглашение nr]», YearMonth, [201503], [201506], [201504], [ 201505] FROM (Выберите [Соглашение nr], YearMonth from #tester) src PIVOT ( COUNT ([Соглашение nr]) FOR YearMonthIN ([201503], [201506], [201504], [201505])) AS PVTTable 'не является допустимым идентификатором. – user3197575

0

Вы пропускаете скобку

SET @DynamicPivotQuery = 
    N'SELECT [Agreement nr],YearMonth , ' + @ColumnName + ' 
    FROM #FINAL 
    PIVOT(
      COUNT([agreement nr]) 
      FOR YearMonth IN (' + @ColumnName + ')) AS PVTTable' 
--Execute the Dynamic Pivot Query 
0

Вы забыли закрыть стержень.

PIVOT(
     COUNT(Kundavtalid) 
     FOR YearMonth IN (' + @ColumnName + ') 
    ) AS PVTTable' -- here you miss pathernesis