【问题标题】:Columns as values/Un-pivot table in SQLSQL 中的列作为值/取消透视表
【发布时间】:2022-01-12 21:34:12
【问题描述】:

我有下表。

表_1

ID 12/1 1/1 2/1
X 1 2 3
Y 4 5 6
Z 7 8 9

我想要下表,

ID Date Forecast
X 12/1 1
X 1/1 2
X 2/1 3
Y 12/1 4
Y 1/1 5
Y 2/1 6
Z 12/1 7
Z 1/1 8
Z 2/1 9

有没有我可以在 SQL 中做到这一点?

任何帮助将不胜感激!

提前致谢。

【问题讨论】:

  • 根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
  • 您所追求的是不旋转,而不是旋转。
  • 那些列的设计很糟糕:您不应该在列名中包含数据。换句话说,您的最终结果是表格最初应该是怎样的

标签: sql sql-server tsql


【解决方案1】:

UNPIVOT 或 VALUES 方法的性能会更高,但根据您的列名,我怀疑随着时间的推移您会有可变/扩展列。

这是一种无需实际使用动态 SQL 或不必指定列(仅要排除的列)即可动态反透视数据的方法

示例

Select A.ID
      ,B.* 
 From  YourTable A
 Cross Apply (
                Select Date     = [Key]
                      ,Forecast = Value
                 From OpenJson((Select A.* For JSON Path,Without_Array_Wrapper,INCLUDE_NULL_VALUES  )) 
                 Where [Key] not in ('ID')
             ) B

结果

ID  Date    Forecast
X   12/1    1
X   1/1     2
X   2/1     3
Y   12/1    4
Y   1/1     5
Y   2/1     6
Z   12/1    7
Z   1/1     8
Z   2/1     9

【讨论】:

  • 我删除了我的答案,OP 如果您有任何其他列名的计划,这绝对是要走的路。
  • 谢谢!
  • @Sai 总是乐于提供帮助
猜你喜欢
  • 1970-01-01
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多