对于每一行,我想为列中的每个值添加其他行

时间:2019-01-22 19:09:25

标签: sql sql-server

我想获取一行数据,并为特定列中的每个值创建新行。

所以我想采用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

我不确定该采取什么方法。我考虑使用数据透视转置列,但是,如果不使用一些聚合函数,我似乎无法使其解决。

4 个答案:

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