2014-04-22 71 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