【问题标题】:Cross apply along with additional columns [duplicate]与其他列交叉应用[重复]
【发布时间】: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


【解决方案1】:

您可以使用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

【讨论】:

  • 尝试过加入,但由于数据量很大,性能很慢。如果我必须用例,该表还包含最少 500 多列,那么查询将是巨大的。
  • 它的执行速度有多快?任何时候您操作“大量数据”都需要一些时间。就我的钱而言,我仍然认为你最好的选择是 unpivot。
  • 现在使用 UNPIVOT 大约需要 90 秒。
  • @BumbleBee CROSS APPLY 的表现如何?
  • 使用 Cross apply 后,12 秒内会发生反透视。
猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 2021-10-12
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多