将列拆分成行的最佳方法是什么(如矩阵?) 示例表:
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
还有其他建议吗?
答案 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)