2013-06-19 63 views
0

我有一個表,名爲******中國,其中有:帶有重複列鍵透視表

CREATE TABLE PhoneNumber(
PhoneNumberID int Identity(1, 1), 
CustomerID int NOT NULL, 
Preference int NULL, 
PhoneNumber nvarchar(20)) 

客戶可能有0個電話號碼,我需要轉動這一點,它加入到輸出視圖數據進行郵件合併。我的用戶希望能夠使用字段名稱獲得合併數據:Phone1,Phone2,Phone3,它們來自上表,並且按照優先順序排序。我只想要首選3個數字。

數據並不漂亮。偏好字段可能不是順序的,對每個客戶來說都不是唯一的。例如,客戶可能有2個優先等於0的數字。我並不關心哪個電話號碼是第一個,如果首選項相等於多個號碼,但我不能像動態PIVOT中那樣使用乾淨的「首選項」作爲列鍵。

我需要加入此客戶ID的視圖。該視圖需要有4列:CustomerID,Phone1,Phone2,Phone3

我已經嘗試使用ROWNUMBER指定行號,當按優先順序排序時,這不起作用,因爲它爲PhoneNumber中的每一行分配一個ROWNUMBER表。

我也嘗試了一個可怕的UNION查詢,但它很糟糕。

INSERT INTO PhoneNumber 
(CustomerID, Preference, PhoneNumber) VALUES 
(1, 0, '555-1234') 
GO 

INSERT INTO PhoneNumber 
(CustomerID, Preference, PhoneNumber) VALUES 
(1, 0, '555-4321') 
GO 

INSERT INTO PhoneNumber 
(CustomerID, Preference, PhoneNumber) VALUES 
(1, 4, '555-1111') 
GO 

INSERT INTO PhoneNumber 
(CustomerID, Preference, PhoneNumber) VALUES 
(2, 0, '555-2222') 
GO 

輸出

CustomerID | Phone1 | Phone2 | Phone3  
1   | 555-1234 | 555-4321 | 555-1111 
2   | 555-2222 | NULL  | NULL 

回答

2
SELECT * FROM(
    SELECT CustomerID,r_id,PhoneNumber FROM (
     SELECT * ,ROW_NUMBER() OVER (PARTITION BY customerid ORDER BY preference) as r_id 
     FROM PhoneNumber) AS a WHERE r_id<=3 
    )AS P 
PIVOT(
    MAX(PhoneNumber) FOR r_id in ([1],[2],[3]) 
)AS Pvt 

希望這會幫助你。

+0

太棒了!非常感謝你。我將閱讀PARTITION BY。 – Molloch