首页 > 解决方案 > 将多列转置为来自不同表的行

问题描述

我正在尝试将多列转换为 2 个表中的行,但我不知道如何开始。

我知道如何 UNPIVOT 一张表,只是不知道如何加入它们;如果这是有道理的。

所以我有一个这样的主表:

mainId  Date            Rd  HT      AT      C1  C2  C3  C4
12      8/9/19 20:00    1   POOL    WICH    0   0   2   0
13      8/10/19 12:30   1   HAM     MCIT    2   0   2   0

第二个表(通过 mainId 链接到主表):

Id  mainId  MO_H    MO_D    MO_A    O0.5  ......-> there are like 180 columns; so dynamic SQL is needed here.
331 12      2.09    3.56    4.1     1.063
332 13      1.71    4.15    5.65    1.048

我想要实现的是:

mainId  Date            Rd  HT      AT      Column1  Column2
12      8/9/19 20:00    1   POOL    WICH    MO_H     2.09
12      8/9/19 20:00    1   POOL    WICH    MO_D     3.56
12      8/9/19 20:00    1   POOL    WICH    MO_A     4.1
12      8/9/19 20:00    1   POOL    WICH    O0.5     1.063
13      8/10/19 12:30   1   HAM     MCIT    MO_H     1.71
13      8/10/19 12:30   1   HAM     MCIT    MO_D     4.15
13      8/11/19 12:30   1   HAM     MCIT    MO_A     5.65
13      8/12/19 12:30   1   HAM     MCIT    O0.5     1.048

提前致谢。

标签: sql-servertranspose

解决方案


这是一个选项,可以在不实际使用动态 SQL 的情况下动态取消数据透视。这种方法是 XML ... JSON 版本喜欢您的列名[O0.5]

请注意,您只需要排除某些列 ... not in ('Id','mainId')

我还应该补充一点:NULL 值将被排除在外。

例子

Select A.[mainId]
      ,A.[Date]
      ,A.[Rd]
      ,A.[HT]
      ,A.[AT]
      ,D.*
 From  Main  A
 Join  Second B on  A.mainId=B.mainId
 Cross Apply ( values ( convert(xml,(Select B.* for XML RAW)) ) ) C(XMLData)
 Cross Apply (
                Select Item  = xAttr.value('local-name(.)', 'varchar(100)')
                      ,Value = xAttr.value('.','varchar(max)')  --<< use proper data type
                 From  XMLData.nodes('//@*') xNode(xAttr)
                 Where xAttr.value('local-name(.)', 'varchar(100)') not in ('Id','mainId')
             ) D

退货

mainId  Date            Rd  HT      AT      Item    Value
12      8/9/19 20:00    1   POOL    WICH    MO_H    2.09
12      8/9/19 20:00    1   POOL    WICH    MO_D    3.56
12      8/9/19 20:00    1   POOL    WICH    MO_A    4.10
12      8/9/19 20:00    1   POOL    WICH    O.05    1.063
13      8/10/19 12:30   1   HAM     MCIT    MO_H    1.71
13      8/10/19 12:30   1   HAM     MCIT    MO_D    4.15
13      8/10/19 12:30   1   HAM     MCIT    MO_A    5.65
13      8/10/19 12:30   1   HAM     MCIT    O.05    1.048

推荐阅读