将列拆分成行的最佳方法?

Ste*_*nie 2 sql sql-server matrix

将列拆分成行的最佳方法是什么(如矩阵?)示例表:

Name Hours1 Hours2 Hours3
Jon  32     40     30
Ana  40     0      40
Run Code Online (Sandbox Code Playgroud)

结果(不显示0值):

Name Hours
Jon  32
Jon  40
Jon  30
Ana  40
Ana  40
Run Code Online (Sandbox Code Playgroud)

我能想到这样做的一种方法是使用 Union

SELECT
  Name,
  Hours1
FROM #HOURSTABLE
WHERE Hours1 <> 0

UNION ALL

SELECT
  Name,
  Hours2
FROM #HOURSTABLE
WHERE Hours2 <> 0

UNION ALL

SELECT
  Name,
  Hours3
FROM #HOURSTABLE
WHERE Hours3 <> 0
Run Code Online (Sandbox Code Playgroud)

还有其他建议吗?

Joh*_*tti 9

我更喜欢CROSS APPLY这样的物品.它提供了更多的灵活性.

Select Name
      ,B.*
 From  YourTable A
 Cross Apply ( values (Hours1)
                     ,(Hours2)
                     ,(Hours3)
             ) B(Hours)
 Where B.Hours<>0
Run Code Online (Sandbox Code Playgroud)

返回

Name    Hours
Jon     32
Jon     40
Jon     30
Ana     40
Ana     40
Run Code Online (Sandbox Code Playgroud)