动态透视-SQL Server
我有一个用于以下查询的测试SQL数据库:动态透视-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进行
使用数据库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吗?