【问题标题】:Pivoting Data based on a field and not hard coding the pivot fields基于字段透视数据而不是对透视字段进行硬编码
【发布时间】:2018-08-06 11:40:26
【问题描述】:
ItemKey UpdatedOnHandQty    AffectedDate
20406   1594.03     2013-12-27 00:00:00.000
20406   842.132     2014-01-09 00:00:00.000
20406   539.03     2014-02-11 00:00:00.000
20406   486.183    2014-05-12 00:00:00.000
20406   917.86     2014-06-27 00:00:00.000
20406   1314.209   2014-07-29 00:00:00.000
20406   512.261    2014-10-20 00:00:00.000
20406   1394.261    2014-11-12 00:00:00.000
20406   640.19     2014-12-30 00:00:00.000
20406   819.992    2014-08-11 00:00:00.000

我想在 sql 中对这些数据进行透视,而不必对透视字段名称进行硬编码。我只希望每个唯一日期(年、月、日)都有一个字段名称。有没有办法根据这个字段进行调整,因为我有 100 个独特的情感日期。这最终将在 BI 工具中被过滤掉,但是对于这个报告,我需要对日期字段进行透视,并且 tableau 不允许在 excel 之外进行透视。

【问题讨论】:

  • 谷歌:“SQL Server 动态数据透视”。
  • 是的,但它必须是 T-SQL 语句吗?我想要一个动态的视图。
  • 您无法使用动态 SQL 创建视图。如果每个日期有多个,你想SUM UpdatedOnHandQty 吗?

标签: sql sql-server sql-server-2005


【解决方案1】:

很遗憾,使用 SQL Server,您根本无法为动态 PIVOT's 或任何动态 SQL 创建 VIEW

存储过程可以为您提供执行此操作的能力。

代码:(Demo)

DECLARE @sql NVARCHAR(MAX)
DECLARE @columns VARCHAR(MAX)
DECLARE @isNullColumns VARCHAR(MAX)

SET @sql = N''
SET @columns = ''
SET @isNullColumns = ''

; WITH item_dates AS
(
  SELECT DISTINCT CONVERT(VARCHAR(10), AffectedDate, 112) AS AffectedDate
  FROM table1
)
SELECT @columns += N',' + QUOTENAME(AffectedDate)
  , @isNullColumns += N',ISNULL(' + QUOTENAME(AffectedDate) + ', 0) AS ' +  QUOTENAME(AffectedDate)
FROM item_dates
ORDER BY AffectedDate

SET @columns = STUFF(@columns, 1, 1, '')
SET @isNullColumns = STUFF(@isNullColumns, 1, 1, '')
SET @sql = N'

;WITH cte AS
(
  SELECT ItemKey
    , CONVERT(VARCHAR(10), AffectedDate, 112) AS AffectedDate
    , UpdatedOnHandQty
  FROM table1
)
SELECT ItemKey
  , ' + @isNullColumns + '
FROM cte
PIVOT 
(
  SUM(UpdatedOnHandQty) FOR AffectedDate IN (' + @columns + ')
) as p'

EXEC sp_executesql @sql;

说明:

  • 为了能够动态执行此操作,您需要将动态 SQL 语句存储在一个变量中(例如:@sql)。
  • 列的名称存储在一个变量 (@columns) 中,以便根据您的 AffectedDate 列的 DISTINCT 值动态构建列。
  • @isNullColumns 变量用于获取环绕ISNULL() 函数的列名。否则,您的转置数据可能会以NULL's 结尾。

【讨论】:

    猜你喜欢
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-04-30
    • 2016-02-29
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多