sqlserver中的动态多透视

h9a6wy2h  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(307)

我是sql server pivot的新手。我有一个输入表,数据如下所示。它有三个金额列的模型数据。根据提供的日期,这些金额适用于这些车型。

我试图以动态的方式生成一个如下所示的报告,其中每个模型的报告中应显示不同数量的日期和三个金额。

我尝试了下面这样的动态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;

当我尝试这个查询时,我得到了以下错误。
pivot运算符中指定的列名“2000-01-01”与pivot参数中的现有列名冲突。
请给我点提示。

zvokhttg

zvokhttg1#

最后我使用下面的查询得到了结果

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;

相关问题