sql server 反透视表

Posted

技术标签:

【中文标题】sql server 反透视表【英文标题】:sql server unpivoting table 【发布时间】:2009-12-10 14:09:11 【问题描述】:

我在尝试取消透视下表时遇到问题。

|操作 | ...其他列... | A1 | B1 | C1 | A2 | B2 | C2 | A3 | B3 | C3 | ... |

变成这样……

|操作 | ...其他列... |价值 | B值 | C 值 |

我现在是这样的

SELECT operation , ...other columns , Avalue, BValue , CValue
FROM (SELECT operation, ...other columns, A1, B1, C1
      FROM MyTable

      UNION ALL  

      SELECT operation, ...other columns, A2, B2, C2
      FROM MyTable

      UNION ALL

      SELECT operation, ...other columns, A3, B3, C3
      FROM MyTable
)

问题是我有 30 组 ABC,所以有 30 个工会。我已经尝试使用 unpivot,但我无法提出正确的解决方案,这是我第一次尝试使用它。

这是我尝试使用 UNPIVOT

SELECT opration
       , ...other columns ...
       ,AValue
       ,BValue
       ,CValue
FROM     MyTable
UNPIVOT ( [AValue] FOR XX IN (A1,A2,A3,...,A30)) AS upv1
UNPIVOT ( [BValue] FOR yy IN (B1,B2,B3,...,B30)) AS upv2
UNPIVOT ( [CValue] FOR ZZ IN (C1,C2,C3,...,C30)) AS upv3

问题是我不明白为什么返回数百万行,而预期应该是大约 10k。有什么想法吗?

编辑:我刚刚意识到每个 UNPIVOT 都与导致“数据爆炸”的前一个 unpivot 语句的结果集一起工作。

谢谢

【问题讨论】:

【参考方案1】:

完成! Plamen Ratchev给了我最后的帮助here

SELECT opration
       , ...other columns ...
       ,AValue
       ,BValue
       ,CValue
FROM     MyTable
UNPIVOT ( [AValue] FOR XX IN (A1,A2,A3,...,A30)) AS upv1
UNPIVOT ( [BValue] FOR yy IN (B1,B2,B3,...,B30)) AS upv2
UNPIVOT ( [CValue] FOR ZZ IN (C1,C2,C3,...,C30)) AS upv3
WHERE RIGHT(XX, 2) = RIGHT(YY, 2)
  AND RIGHT(XX, 2) = RIGHT(ZZ, 2)

【讨论】:

【参考方案2】:

我不太清楚您在寻找什么,但您可以尝试“联合”而不是“全部联合”。

【讨论】:

以上是关于sql server 反透视表的主要内容,如果未能解决你的问题,请参考以下文章

动态反透视和拆分列 SQL Server 2012

反透视表 SQL Oracle

SQL 从反透视表中删除过滤器

Microsoft Access 数据透视表到 SQL Server 数据透视表

Databricks/Spark SQL 中的反透视表

在 SQL 中反透视表时获取值存在的列的位置