sql server unpivoting表

时间:2009-12-10 14:09:11

标签: sql-server-2005 tsql unpivot

我在尝试取消下表的操作时遇到了麻烦。

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

这样的事情......

|操作| ......其他栏目...... AValue | BValue | CValue |

现在就像这样做

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语句的结果集,导致'数据爆炸'。

由于

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我不太清楚你在寻找什么,但你可能会尝试“联盟”而不是“联合所有”。