将数据拆分为多行

时间:2014-04-22 17:04:00

标签: sql-server

我从存储在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开始,然后在需要时递增。

感谢您的帮助。

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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