交叉应用以及其他列

时间:2015-01-27 19:48:05

标签: sql sql-server cross-apply

我有两张表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取消对表格的破坏,但性能不太好。随着交叉应用的表现真的很好。

1 个答案:

答案 0 :(得分:0)

您可以使用join

执行此操作
select st.MNUM, lt.LabelName,
       (case when lt.LabelName = 'la1' then la1
             when lt.LabelName = 'la2' then la2
             when lt.LabelName = 'la3' then la3
             when lt.LabelName = 'la4' then la4    
        end) as LabelValue,
       st.PropertyType 
from #labelTempTab lt join
     #SetValuesTable st
     on st.mnum = lt.label