2016-07-08 2 views
0

Могу ли я использовать конкатенацию в качестве переменной перетаскивания в динамическом стержне?Динамический 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 для создания заголовков столбцов таким образом или мне нужно использовать только запись (это означает, что мне нужно добавить это поле в качестве столбца, который я бы а не делать, это не мой стол)

Благодаря

+0

Глядя на [документах] (https://msdn.microsoft.com/en-us/library/ms177410.aspx) sugguests SQL Server ожидает именованный столбец после FOR и список поворотных колонн после IN. Это не может быть параметризовано напрямую. Вам понадобится динамический SQL для их вычисления, поскольку он заполняет @query var. –

+0

Я думаю, что синтаксис PIVOT должен быть PIVOT (SUM ([...]) FOR IN (value1, value2, ...)) стр. Строка @Query выше, похоже, нарушает это. – DVT

ответ

0

вы пробовали следующий код EDIT:?. вы должны исходные значения даты как в выберите и в операторах вы должны изменить ваш «выбрать @cols = ... "часть запроса для возврата исходных значений (избавиться от материала datepart в столбце) в качестве имен столбцов и их псевдонимов по вашему желанию. Оператор IN требует полных значений.

set @query = 
'SELECT [RW_Ref], [Transaction_Type], [Batch_Number], ' 
     + @cols 
     + ' ' 
     +'FROM [TX].[dbo].[Transactions] 
       PIVOT (
        SUM([Transaction_Value]) 
       FOR 

        [Transaction_Date] IN (' 
        + @cols + ') 
       ) p ' 

Пожалуйста, дайте мне знать, если это сработает. См. Пример ниже, который вы можете запустить в базе данных примеров TSQL2012, поэтому он должен помочь вам понять, как работает сводный оператор.

select shipperid, [2006-07-29 00:00:00.000] as '2006/07', [2006-08-12 00:00:00.000] as '2006/08' 
from sales.orders 
pivot (sum (freight) for shippeddate in ([2006-07-29 00:00:00.000], [2006-08-12 00:00:00.000])) as p 
+0

Спасибо. Это работает: o) Однако он создает таблицу со столбцом для каждого дня, чего я пытался избежать. По крайней мере, я понимаю динамические точки теперь достаточно, чтобы знать, что я не могу использовать его для этого, мне придется использовать другой подход. –

+0

Я думаю, вы могли бы попробовать написать подзапрос, который будет группировать транзакции по месяцам, а затем использовать его для поворота. – PacoDePaco

 Смежные вопросы

  • Нет связанных вопросов^_^