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

时间:2018-01-04 22:02:04

标签: sql sql-server matrix

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

Name Hours1 Hours2 Hours3
Jon  32     40     30
Ana  40     0      40

结果(不显示0值):

Name Hours
Jon  32
Jon  40
Jon  30
Ana  40
Ana  40

我能想到的一种方法是使用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

还有其他建议吗?

2 个答案:

答案 0 :(得分:9)

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

示例

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

<强>返回

Name    Hours
Jon     32
Jon     40
Jon     30
Ana     40
Ana     40

答案 1 :(得分:2)

一种方法是使用unpivot

https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

 declare @t table (name varchar(50), hours1 int, hours2 int, hours3 int)

 insert @t 
 select 'Jon ', 32     ,40     ,30
 union
 select 'Ana  ',40     ,0      ,40

 select name, hours from @t
 unpivot (hours for h in (hours1, hours2, hours3)) u
 where hours<>0

来自unpivot的完整结果意味着您不会丢失hours值所在列的信息(即:hours1,hours2,hours3)