Sql server 将不同表中的多列转换为行

Sql server 将不同表中的多列转换为行,sql-server,transpose,Sql Server,Transpose,我正在尝试将两个表中的多个列转换为行,但我不知道如何开始 我知道如何取消一张桌子,只是不知道如何加入他们;如果这有道理的话 所以我有一个这样的主表: 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  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链接到主表):

我想要实现的是:

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的情况下动态地取消归档数据。这种方法是XML。。。JSON版本与您的列名
[O0.5]

请注意,您只需要排除某些列
。。。不在('Id','mainId')中

我还应该补充:空值将被排除

示例

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
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