在SQL Server管理工作室中将列传输到行

时间:2013-04-09 01:54:44

标签: sql sql-server sql-server-2008 tsql

表1

column_pk  num  name   id -1   id-2     id-3
1          145  sam    12345   null     34527
2          187  tom    null    76544    null
3          567  david  78965   43215    89765
4          675  john   null    null     null

如上表所示,对于给定的column_pk id-1,id-2,id-3可以有值,也可以为null

现在我必须将id-1,i d-2id-3移至Table2行,如下所示:

  • 由于Sam有2个id:id-1& id-3对于相同的数字145 Sam有2行

  • 由于David在Table 1中有3个ID,因此Table 2为David提供了3行相同的数量567

表2

Column_pk  num    name     id
1          145    sam      12345
2          145    sam      34527
3          187    tom      76544
4          567    david    78965
5          567    david    43215          
6          567    david    89765
  • 我尝试使用少量更新语句,但这些语句仅对有限数据有用。如果有大量的数据传输,你能帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

由于您使用的是SQL Server 2008,因此可以使用CROSS APPLYVALUES 取消数据。此过程将获取列值并将其转换为行:

select row_number() over(order by t1.column_pk) column_pk,
  t1.num, 
  t1.name, 
  c.value
from table1 t1
cross apply
(
  values 
    ('id1', id1),
    ('id2', id2),
    ('id3', id3)
) c (col, value)
where c.value is not null;

请参阅SQL Fiddle with Demo

答案 1 :(得分:0)

您可以使用UNION来合并结果。然后使用ROW_NUMBER()获取新的pk列:

select Row_Number() OVER (ORDER BY column_pk,sortorder) Column_pk, 
  num, name, id
from
  (
    select column_pk, num, name, id1 id, 1 sortorder
    from yourtable
    union 
    select column_pk, num, name, id2, 2 sortorder
    from yourtable
    union 
    select column_pk, num, name, id3, 3 sortorder
    from yourtable
    ) t
where id is not null

SQL Fiddle Demo