2014-04-22 72 views
0

我从存储在MSSQL 2012数据库中的遗留系统中提取客户数据。在此表中,夫妇通过使用Name_1和Name_2字段的单个客户代码进行。它看起来像这样:将数据拆分为多行

ID  | Name_1  |  Name_2  |  Address 
-----  --------   ---------  --------- 
DOE001 | John Doe  | Jane Doe  | 1234 Somewhere St. 

我们的新系统需要将这些信息分开。它们将是具有相同ID但是称为“地址ID”的区分字段的单独记录。我正在寻找一种方式来分割类似下面的信息:

Customer ID  | Name  |  Address  |  Address ID 
    -----------   -------   ----------  -------------- 
     DOE001  | John Doe | 1234 Somewhere St |  01 
     DOE001  | Jane Doe | 1234 Somewhere St |  02 

我想感谢所有帮助生成查询,将信息分成多行,如果有可能产生新的地址ID。对于每个新的客户ID,地址ID将从01开始,然后根据需要增加。

谢谢你的帮助。

回答

2
WITH CTE AS (
    SELECT ID, Name_1 AS Name, Address FROM myTable 
    UNION ALL 
    SELECT ID, Name_2 AS Name, Address FROM myTable 
) 

SELECT *, ROW_NUMBER() OVER (ORDER BY ID, Name, Address) AS [Address ID] FROM CTE 

首先,这将每行分成两行,分割名称。接下来它会生成一个唯一的[Address ID],基于排序(在本例中)ID, Name, Address递增。

1

试试这个,假设你将只有2名场,

SELECT v.* 
FROM t 
CROSS APPLY 
(
    VALUES (id, name_1, Address,'01'), (id, name_2, Address, '02') 
) 
v (id, name, Address, Address_id) 

SQL DEMO

+0

+1很好的解决方案,然而值'01'和'02'实际上并不是'ID',因为它们会在每个'[Customer ID]'上重复,是吗? – Aquillo

+0

@Aquillo,基于OP的问题,它看起来像每个客户ID只有两行,我不认为我们需要row_number,当我们知道数据集总是只返回2行。检查我的SQL演示,它会重复每个客户ID :)并且OP提到他希望地址ID从01开始为每个新客户 –

+0

在这种情况下,'([Customer ID],[Address ID])'主键“。 OP应该真正考虑什么更适合他的情况。 :) – Aquillo

0
CREATE TABLE #temp 
    (ID VARCHAR(10), Name_1 VARCHAR(100), Name_2 VARCHAR(100), [Address] VARCHAR(100)) 
INSERT INTO #temp 
VALUES ('DOE001', 'John Doe', 'Jane Doe', '1234 Somewhere St.') 

SELECT 
    ID AS CustomerID 
    , Name 
    , [Address] 
    , ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Name) AS AddressID 
FROM #temp 
UNPIVOT (Name FOR ContactName IN (Name_1, Name_2)) AS Names 

我喜欢的UNPIVOT办法。

以下是解释如何使用UNPIVOT的帖子的链接。 http://weblogs.sqlteam.com/jeffs/archive/2008/04/23/unpivot.aspx