具有重复列键的PIVOT表

时间:2013-06-19 08:56:35

标签: sql sql-server pivot

我有一个名为PhoneNumber的表,其中包含:

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

客户可能有0多个电话号码,我需要将其PIVOT并将其加入到输出邮件合并数据的视图中。我的用户希望能够使用字段名称获取合并数据:Phone1,Phone2,Phone3,它们来自上表,并按优先顺序排序。我只希望按优先顺序排列前三个数字。

数据并不漂亮。首选项字段可能不是顺序的,并且对于每个客户而言不是唯一的。例如,客户可能有2个数字,其中preference = 0。如果偏好等于多个数字,我真的不在乎哪个电话号码是第一个,但是我不能像在动态PIVOT中那样使用干净的“偏好”作为列密钥。

我需要在CustomerID上加入此视图。视图需要有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

1 个答案:

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

希望这会对你有所帮助。