Dynami c Multi Pivot на SQL сервере - PullRequest
0 голосов
/ 17 июня 2020

Я новичок в SQL Server Pivot. У меня есть таблица ввода с данными, представленными ниже. Он имеет данные модели с тремя столбцами количества. Суммы применимы для этих моделей в зависимости от указанной даты.

enter image description here

Я пытаюсь создать отчет, подобный приведенному ниже, в динамическом режиме c способ, при котором в отчете для каждой модели должно отображаться различное количество дат и три суммы.

enter image description here

Я пробовал Dynami c SQL, как показано ниже.

SELECT @pivotcols = STUFF((
                    SELECT ',' + QUOTENAME(DATE)
                    FROM #table
                    GROUP BY Date
                    ORDER BY Date
                    FOR XML PATH('')
                        ,TYPE
                    ).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

SET @query = N'SELECT Model,' + @pivotcols + N' from 
             (
                    SELECT Model
        ,Amount1
        ,Amount2
        ,Amount3
        ,[DATE] AS DATE1
        ,[DATE] AS DATE2
        ,[DATE] AS DATE3
    FROM #table

            ) x
            pivot 
            (
                max(amount1)
                for Date1 in (' + @pivotcols + N')
            ) r
             pivot 
            (
                max(amount2)
                for Date2 in (' + @pivotcols + N')
            ) p
             pivot 
            (
                max(amount3)
                for Date3 in (' + @pivotcols + N')
            ) o '

EXEC sp_executesql @query;

Когда я пытаюсь выполнить этот запрос, я получаю следующую ошибку.

Имя столбца «2000-01-01», указанное в операторе PIVOT, конфликтует с существующим именем столбца в аргументе PIVOT.

Пожалуйста, проясните это.

1 Ответ

1 голос
/ 19 июня 2020

Наконец, я добился результатов, используя запрос ниже

DECLARE @selectcols AS NVARCHAR(MAX) = ''
            ,@pivotcols AS NVARCHAR(MAX) = ''
            ,@query AS NVARCHAR(MAX) = ''

SELECT @selectcols = STUFF((
                    SELECT ',[AMT1-' + convert(VARCHAR(10), [DATE], 101) + ']'
                    + ',[AMT2-' + convert(VARCHAR(10), [DATE], 101) + ']'
                    + ',[AMT3-' + convert(VARCHAR(10), [DATE], 101) + ']'
                    + ',[TOT-' + convert(VARCHAR(10), [DATE], 101) + ']'
                    FROM #table
                    GROUP BY [DATE]
                    ORDER BY [DATE]
                    FOR XML PATH('')
                        ,TYPE
                    ).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

SELECT @pivotcols = STUFF((
                    SELECT ',[AMT1-' + convert(VARCHAR(10), [DATE], 101) + ']'
                    FROM #table
                    GROUP BY [DATE]
                    ORDER BY [DATE]
                    FOR XML PATH('')
                        ,TYPE
                    ).value('.', 'NVARCHAR(MAX)'), 1, 1, '')


SET @query = N'SELECT [Model],' + @selectcols + N' from 
             (
                select [Model],AMT1,AMT2,AMT3,AMT1+AMT2+AMT3 AS TOT
                ,''AMT1-'' + convert(VARCHAR(10), [DATE], 101) as DATE1
                ,''AMT2-'' + convert(VARCHAR(10), [DATE], 101) as DATE2
                ,''AMT3-'' + convert(VARCHAR(10), [DATE], 101) as DATE3
                ,''TOT-'' + convert(VARCHAR(10), [DATE], 101) as DATE4
                from #table
            ) x
            pivot 
            (
                max(AMT1)
                for DATE1 in (' + @pivotcols + N')
            ) r
             pivot 
            (
                max(AMT2)
                for DATE2 in (' + replace(@pivotcols,'AMT1','AMT2') + N')
            ) p
             pivot 
            (
                max(AMT3)
                for DATE3 in (' + replace(@pivotcols,'AMT1','AMT3') + N')
            ) o
            pivot 
            (
                max(TOT)
                for DATE4 in (' + replace(@pivotcols,'AMT1','TOT') + N')
            ) t'

EXEC sp_executesql @query;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...