我有一个名为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
答案 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
希望这会对你有所帮助。