【问题标题】:PIVOT Table with Duplicate column key具有重复列键的数据透视表
【发布时间】:2013-06-19 08:56:35
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server pivot


    【解决方案1】:
    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
    

    希望这会对你有所帮助。

    【讨论】:

    • 太棒了!非常感谢。我将阅读 PARTITION BY。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多