我从存储在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开始,然后在需要时递增。
感谢您的帮助。
答案 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)
答案 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