【发布时间】:2015-01-27 19:48:04
【问题描述】:
我有两张桌子 1.#SetValuesTable 2.#labelTempTab
#SetValuesTable 中的数据如下所示:
MNUM la1 la2 la3 la4 PropertyType
12 1 0 2 s
13 4 0 5 7 p
#labelTempTab 中的数据如下所示:
RowNum Label Title PropertyType
1 la1 Agent1 s
2 la2 Agent2 s
3 la3 Agent3 s
4 la1 Agent1 p
5 la2 Agent2 p
6 la3 Agent3 p
7 la4 Agent4 p
我需要这样的结果表:
MNUM LabelName LabelValue PropertyType
12 la1 1 s
12 la2 0 s
12 la3 2 s
13 la1 4 p
13 la2 0 p
13 la3 5 p
13 la4 7 p
查询:
SELECT MNUM, LabelName , LabelValue FROM #SetValuesTable
CROSS APPLY ( VALUES '
stuff(( SELECT ',('''+ replace(C.label,'''','"') + ''',' + quotename(C.label) + ')' FROM #labelTempTab c group by label FOR xml path('')), 1, 1, '')
) AS UPTab (Label , LabelValue);
上述查询将导致:
MNUM LabelName LabelValue
12 la1 1
12 la2 0
12 la3 2
13 la1 4
13 la2 0
13 la3 5
13 la4 7
一些人也可以帮助我获得其余的列。
注意:我尝试使用 UNPIVOT 解表,但性能不太好。使用交叉应用,性能非常好。
【问题讨论】:
-
为什么要使用动态 SQL?
-
戈登我发布的查询只是较大查询的一部分。常规 SQL 的解决方案也适用于我。修改了问题。
-
您说您有 500 多列,但我只能在您的两个表中计算 10 列。其余的在哪里?
-
我只放了一个样本来了解我在做什么!!!
标签: sql sql-server cross-apply