如何在多行SQL Server中拆分一行?

时间:2018-07-11 13:57:22

标签: sql sql-server

我想将sql表中的一行转换为其他表中的多行。 例如:说如果我有一个表“ UserDetail”,而他有2个地址(家庭,办公室...),则该表看起来像...

enter image description here

我希望结果如图所示在第二个表中

3 个答案:

答案 0 :(得分:3)

您可以使用“全部联盟”来做到这一点:

gdal_translate

如果仅使用UNION而不是UNION ALL,那么还将删除地址1和地址2相同的重复项。

答案 1 :(得分:3)

我们可以使用交叉申请

;WITH CTE(UseriD,Address1Line,Address1City,Address1State,Address2Line,Address2City,Address2State )
AS
(
SELECT 1,'Line1','City1','State1','Line2','City2','State2'
)
SELECT UseriD,[Address],City,[State]
FROM CTE
CROSS APPLY ( VALUES (Address1Line,Address1City,Address1State ),
                     (Address2Line,Address2City,Address2State )
            )AS Dt([Address],City,[State])

结果

UseriD  Address City    State
-----------------------------
1       Line1   City1   State1
1       Line2   City2   State2

演示:http://rextester.com/KHFUM28227

答案 2 :(得分:0)

您可以将表交叉连接或交叉应用到数字列表中。
然后使用IIF或CASE获取相应的编号字段。

或在表上直接对地址值进行交叉应用。

示例代码段

declare @UserTable table (UserId int, Address1Line varchar(30), Address1City varchar(30), Address1State varchar(30), Address2Line varchar(30), Address2City varchar(30), Address2State varchar(30));

insert into @UserTable (UserId, Address1Line, Address1City, Address1State, Address2Line, Address2City, Address2State) values 
(1,'Wonder Lane 42','WonderTown', 'WonderState', 'Somewhere 1 B', 'Nowhere', 'Anywhere'),
(2,'Backstreet 69','Los Libros', 'Everland', 'Immortal Cave 777', 'Ghost City', 'The Wild Lands');

-- Cross Join on numbers
select UserId, 
case n when 1 then Address1Line when 2 then Address2Line end as [Address],
case n when 1 then Address1City when 2 then Address2City end as [City],
case n when 1 then Address1State when 2 then Address2State end as [State]
from @UserTable u
cross join (values (1),(2)) as nums(n);

-- Cross Apply on Adress values
select UserId, [Address], [City], [State]
from @UserTable Usr
cross apply (values 
 (1, Address1Line, Address1City, Address1State),
 (2, Address2Line, Address2City, Address2State)
) AS Addr(n, [Address], [City], [State]);

两者的回报:

UserId Address           City       State
------ ----------------- ---------- --------------
1      Wonder Lane 42    WonderTown WonderState
1      Somewhere 1 B     Nowhere    Anywhere
2      Backstreet 69     Los Libros Everland
2      Immortal Cave 777 Ghost City The Wild Lands