0

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

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

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

数据并不漂亮。偏好字段可能不是连续的,并且对于每个客户来说不是唯一的。例如,客户可能有 2 个偏好 = 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
4

1 回答 1

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

希望这会帮助你。

于 2013-06-19T09:40:43.867 回答