【问题标题】:Dynamic Pivot - SQL Server动态透视 - SQL Server
【发布时间】:2015-02-25 23:41:49
【问题描述】:

我有一个测试 SQL 数据库,查询如下:

USE DataBase1

Select Data.MonthDate,
  Data.AccountID,
  Data.MonthID,
  Data.Sales,
  Data.AccountName
From Test1 as Data with(nolock)

我需要根据销售列进行调整。问题是我运行此查询的月份总是会发生变化(尽管它们总是有 4 个),并且它们需要在基于 MonthDate 列的旋转结果中从左到右/最旧-最新排序。运行查询时的初始返回如下所示:

而最终的结果需要是这样的:

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

我正在使用 SQL Server Management Studio,而我将针对它运行的实际数据库超过 200,000 行。

有什么想法吗?

谢谢,

约书亚

【问题讨论】:

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

标签: sql sql-server dynamic pivot


【解决方案1】:

使用Dynamic Query

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 

【讨论】:

    【解决方案2】:

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

    这是一个如何完成此操作的示例:http://sqlhints.com/tag/dynamic-pivot-column-names/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-10
      • 2016-10-28
      • 2014-10-16
      • 2014-07-26
      • 1970-01-01
      • 2021-06-07
      • 2013-01-25
      • 2013-02-09
      相关资源
      最近更新 更多