我想获取一行数据,并为特定列中的每个值创建新行。
所以我想采用col3,col4和col5并为每个列值创建新行
table 1
col1 col2 col3 col4 col5
01 John 123 345 123
02 Bob 111 222 NULL
我希望输出为
table output
col1 col2 [new]
01 John 123
01 John 345
01 John 123
02 Bob 111
02 Bob 222
我不确定该采取什么方法。我考虑使用数据透视转置列,但是,如果不使用一些聚合函数,我似乎无法使其解决。
答案 0 :(得分:2)
您可以在SQL Server中利用unpivot
运算符。
select a.col1
, a.col2
, a.new
from table1 as t
unpivot ([new] for col_nm in ([col3], [col4], [col5])) as a
答案 1 :(得分:1)
您要取消数据透视。我认为最好的方法是使用apply
关键字通过横向联接:
select v.*
from table1 t1 cross apply
(values (t1.col1, t1.col2, t1.col3),
(t1.col1, t1.col2, t1.col4),
(t1.col1, t1.col2, t1.col5)
) v(col1, col2, [new])
where [new] is not null;
这比使用union all
的方法要好,因为原始表仅扫描一次。
答案 2 :(得分:0)
使用交叉连接获取更多行:
Select
t.col1
,t.col2
,case
when dat.row_type = 1 then t.col3
when dat.row_type = 2 then t.col4
else t.col5
end as new_col
From table t
Cross join (
Select 1 as row_type
Union all select 2
Union all select 3
) dat
Where (dat.row_type = 1 and t.col1 is not null)
Or (dat.row_type = 2 and t.col2 is not null)
Or (dat.row_type = 3 and t.col3 is not null)
答案 3 :(得分:0)
最好的方法是与所有人联合。
像这样:
SELECT col1, col2, col3
FROM table1
WHERE col3 is not null
UNION ALL
SELECT col1, col2, col4
FROM table1
WHERE col4 is not null
UNION ALL
SELECT col1, col2, col5
FROM table1
WHERE col5 is not null