Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
动态透视-SQL Server_Sql_Sql Server_Dynamic_Pivot - Fatal编程技术网

动态透视-SQL Server

动态透视-SQL Server,sql,sql-server,dynamic,pivot,Sql,Sql Server,Dynamic,Pivot,我有一个用于以下查询的测试SQL数据库: 使用数据库1 选择Data.MonthDate, Data.AccountID, Data.MonthID, 数据,销售,, Data.AccountName 来自Test1的数据(nolock) 我需要以销售栏为基础进行调整。问题是,我运行此查询的月份总是会发生变化(尽管总是有4个月),并且它们需要在基于MonthDate列的数据透视结果中从左到右排序/从最新排序。运行查询时的初始返回如下所示: 最终结果需要如下所示: 我在这里使用Excel进行

我有一个用于以下查询的测试SQL数据库:

使用数据库1
选择Data.MonthDate,
Data.AccountID,
Data.MonthID,
数据,销售,,
Data.AccountName
来自Test1的数据(nolock)
我需要以销售栏为基础进行调整。问题是,我运行此查询的月份总是会发生变化(尽管总是有4个月),并且它们需要在基于MonthDate列的数据透视结果中从左到右排序/从最新排序。运行查询时的初始返回如下所示:

最终结果需要如下所示:

我在这里使用Excel进行演示,并突出显示了0,因为这些值在技术上是空值,但我需要它们返回为0

我使用的是SQLServerManagementStudio,我将运行它的实际数据库超过200000行

有什么想法吗

谢谢


Joshua

基本上,您需要动态构建PIVOT查询并使用sp_exec运行它。 SQL Server开箱即用,不支持动态不断变化的列,因为这些列需要在PIVOT查询中定义


下面是一个如何实现这一点的示例:

使用
动态查询

DECLARE @col_list VARCHAR(max)='',
        @sel_list VARCHAR(max)='',
        @sql      NVARCHAR(max)

SELECT DISTINCT @col_list += '[' + Isnull(MonthID, '') + '],'
FROM   Test1
ORDER  BY MonthID

SELECT @col_list = LEFT(@col_list, Len(@col_list) - 1)

SELECT DISTINCT @sel_list += 'Isnull([' + Isnull(MonthID, '') + '],0) ' + '['+ MonthID + '],'
FROM   Test1
ORDER  BY MonthID

SELECT @sel_list = LEFT(@sel_list, Len(@sel_list) - 1)

SET @sql ='select Data.AccountID,Data.AccountName,'+ @sel_list+ ' from (
                Select
                Data.AccountID,
                Data.MonthID,
                Data.Sales,
                Data.AccountName
                From Test1 as Data ) A
                pivot (sum(Sales) for monthid in('+ @col_list + ')) piv'

--PRINT @sql
EXEC Sp_executesql @sql 

你能用所有这些测试数据创建一个sql吗?你试过写sql吗?