这可能与 Unpivot 一起使用吗?
Posted
技术标签:
【中文标题】这可能与 Unpivot 一起使用吗?【英文标题】:Is this Possible with Unpivot? 【发布时间】:2014-07-08 20:02:06 【问题描述】:我有一张这样的桌子:
ForeignKeyA, ForeignKeyB, Before1, After1, Before2, After2, ... Before(n), After(n)
我需要能够创建一个视图,将这个表反透视成这样的:
ForeignKeyA、ForeignKeyB、年份、之前、之后
其中 Year 是 Before/After 列的迭代。
编辑:我现在已经到了这一点,但我不确定如何将年份分开到它自己的列中。
SELECT [f_lForiegnKey], [f_lAnalysisVariableKey], dBefore, dAfter, szBefore, szAfter
FROM
(SELECT [f_lForiegnKey], [f_lAnalysisVariableKey], [dBefore01], [dAfter01], [szBefore01], [szAfter01],
[dBefore02], [dAfter02],[szBefore02], [szAfter02],
[dBefore03], [dAfter03],[szBefore03], [szAfter03],
[dBefore04], [dAfter04],[szBefore04], [szAfter04],
[dBefore05], [dAfter05],[szBefore05], [szAfter05]
FROM [dbo].[A_STRATS_V]) p
UNPIVOT
(dBefore FOR dBeforex IN ([dBefore01], [dBefore02], [dBefore03], [dBefore04], [dBefore05])) AS U1
UNPIVOT
(dAfter FOR dAfterx IN ([dAfter01], [dAfter02], [dAfter03], [dAfter04], [dAfter05])) AS U2
UNPIVOT
(szBefore FOR szBeforex IN ([szBefore01], [szBefore02], [szBefore03], [szBefore04], [szBefore05])) AS U3
UNPIVOT
(szAfter FOR szAfterx IN ([szAfter01], [szAfter02], [szAfter03], [szAfter04], [szAfter05])) AS U4
WHERE RIGHT(dBeforex, 1) = RIGHT(dAfterx, 1)
AND RIGHT(dBeforex, 1) = RIGHT(szBeforex, 1)
AND RIGHT(dBeforex, 1) = RIGHT(szAfterx, 1);
GO
我需要从每组中截断数字并将其放在自己的列中。这可能吗?
谢谢。
【问题讨论】:
为什么我会偷偷怀疑A_STRATS_V
实际上是一个视图?什么关系型数据库?我们可以在这里获得示例起始数据和期望的结果吗?特别是因为我不确定你打算如何获得year
...
V 代表变量。它是 SQL Management Studio 中的一个表,尽管它也需要能够转换为 Oracle。我不确定如何获得这一年。实际上,我可以通过从列名末尾获取数字并将其放入每次迭代的年份字段中来使其工作,但有人告诉我,这在以后是不可能的/不切实际的。
仍在等待样本起始数据和所需结果。
【参考方案1】:
这是可能的。我无法挖掘我的代码,但这里有类似的东西
unpivot with dynamic columns plus column names
基本上,您从 sysobjects 中获取列名并将动态 sql 写入 unpivot。
【讨论】:
以上是关于这可能与 Unpivot 一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章
将 .apply() 与“new”运算符一起使用。这可能吗?