Могу ли я использовать конкатенацию в качестве переменной перетаскивания в динамическом стержне?Динамический pivot SQL Server 2012 - объединение для перетаскивания
Я пытаюсь создать таблицу перекрестных таблиц значений транзакций, где заголовки столбцов [yyyy-mm] в порядке даты, основанные на поле даты транзакции.
Это данные: -
RW_Ref ,Transaction_Date ,Transaction_Type ,Transaction_Value ,Batch_Number ,Month
1 , 03/09/2009 ,11 ,30 ,999
1 , 05/10/2009 ,11 ,25 ,999
1 , 11/10/2009 ,11 ,15 ,999
1 , 15/11/2009 ,11 ,40 ,999
1 , 03/12/2009 ,11 ,30 ,999
2 , 05/10/2009 ,11 ,60 ,999
2 , 11/11/2009 ,11 ,70 ,999
2 , 01/12/2009 ,11 ,60 ,999
2 , 03/12/2009 ,11 ,15 ,999
3 , 05/11/2009 ,11 ,25 ,999
3 , 06/11/2009 ,11 ,35 ,999
3 , 07/11/2009 ,11 ,60 ,999
И это то, что я пытаюсь получить обратно: -
Transaction_Type,Batch_Number,[2009-09],[2009-10],[2009-11],[2009-12]
11 ,999 ,30 ,40 ,40 ,30
11 ,999 , ,60 ,70 ,75
11 ,999 , , ,120 ,
Это код, который я получил до сих пор: -
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ', '
+ QUOTENAME(CONCAT(datepart(yyyy,[Transaction_Date]) , '-', RIGHT('00' + CONVERT(NVARCHAR(2), datepart(M,[Transaction_Date])), 2)))
from [TX].[dbo].[Transactions] ORDER by 1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query =
'SELECT [RW_Ref], [Transaction_Type], [Transaction_Value], [Batch_Number], '
+ @cols
+ ' '
+'FROM [TX].[dbo].[Transactions]
PIVOT (
SUM([Transaction_Value])
FOR
CONCAT(
datepart(yyyy,[Transaction_Date]), '
+ QUOTENAME('-','''')
+ ', RIGHT(' + QUOTENAME('00','''') + ' + CONVERT(NVARCHAR(2), datepart(M,[Transaction_Date])), 2))
) p '
print @query
execute(@query)
печати @Query производит это: -
SELECT [RW_Ref], [Transaction_Type], [Transaction_Value], [Batch_Number], [2009-09], [2009-10], [2009-11], [2009-12], [2016-07] FROM [TX].[dbo].[Transactions]
PIVOT (
SUM([Transaction_Value])
FOR
CONCAT(
datepart(yyyy,[Transaction_Date]), '-',
RIGHT('00' + CONVERT(NVARCHAR(2), datepart(M,[Transaction_Date])), 2))
) p
, но это генерирует сообщение Msg 102, Level 15, State 1, Line 5 Неправильный синтаксис около '('. Строка 5 - это CONCAT (я думаю, могу ли я использовать Concat fun ction для создания заголовков столбцов таким образом или мне нужно использовать только запись (это означает, что мне нужно добавить это поле в качестве столбца, который я бы а не делать, это не мой стол)
Благодаря
Глядя на [документах] (https://msdn.microsoft.com/en-us/library/ms177410.aspx) sugguests SQL Server ожидает именованный столбец после FOR и список поворотных колонн после IN. Это не может быть параметризовано напрямую. Вам понадобится динамический SQL для их вычисления, поскольку он заполняет @query var. –
Я думаю, что синтаксис PIVOT должен быть PIVOT (SUM ([...]) FOR IN (value1, value2, ...)) стр. Строка @Query выше, похоже, нарушает это. –
DVT