【问题标题】:Converting data file to flatfile?将数据文件转换为平面文件?
【发布时间】:2021-03-12 18:02:53
【问题描述】:

我希望将数据文件转换为具有多个层次维度的平面文件格式。我已经包含了一个示例,但理想情况下,我希望转换的列数未知,而层次维度将是固定的。

【问题讨论】:

  • 这个问题没有太多的解释......你如何从一个有 4 列和 16 行的表到有两倍行数的表?
  • 这样的? SELECT country, city, 'Snowfall' AS Metric, Snowfall as Value FROM original_data UNION SELECT country, city, 'Temp' AS metric, Temp as value from original_data

标签: sql sql-server data-conversion


【解决方案1】:

如果您有未知或可变列,您可以在不使用动态 SQL 的情况下动态 UNPIVOT 您的数据。注意我们只需要排除两个关键列...Where [key] not in ('Country','City')

示例

Select Country
      ,City
      ,Metric = B.[key]
      ,Value  = B.Value 
 From  YourTable A
 Cross Apply ( Select * 
                From  OpenJson( (Select A.* For JSON Path,Without_Array_Wrapper  )  ) 
                Where [key] not in ('Country','City')
             ) B
 

退货

Country City    Metric      Value
US      NY      Snowfall    13
US      NY      Temp        94
US      NY      Snowfall    5
US      NY      Temp        84
UK      London  Snowfall    6
UK      London  Temp        85

【讨论】:

  • 这在我看来非常危险。
  • @GordonLinoff 你太搞笑了。 :)
  • @JohnCappelletti 。 . .我可能需要很长时间才能真正记住这一点,所以我认为我暂时不会正确回答动态支点问题。
  • 如何查看动态表格中的所有内容?运行基本 select * from @YourTable 时出错
  • @JDR (at)YourTable 只是一个演示表变量。而不是 (at)YourTable 使用任何需要的表。将 (at)YourTable 替换为实际的表、视图或子查询。
【解决方案2】:

你需要unpivot你的数据:

SELECT unpvt.country
     , unpvt.city
     , unpvt.metrics
     , unpvt.Valuess 
FROM 
( SELECT * FROM tablename ) p
UNPIVOT ( Valuess FOR metrics IN ( snowfall , temp) ) unpvt

【讨论】:

  • 谢谢!无论如何要在我们不必列出列的情况下做到这一点?如果有 100 多个列要取消透视怎么办?
  • 对 - 但没有办法让它成为动态的,这样它就可以自动化了吗?
  • 那么你需要通过dynamic query来构建它
  • 或者选择约翰解决方案
猜你喜欢
  • 2019-10-28
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 2011-05-27
  • 2020-04-18
  • 2013-10-19
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多