我有一个名为 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