我如何将它们从列转换为具有前三个电话号码的行

问题描述 投票:0回答:2
This is the original table columns:

    SELECT
        e18.customer_id,
        CASE
            WHEN PHONE_NUMBER_TYPE = 'PRIMPHONE' THEN 1
            WHEN PHONE_NUMBER_TYPE = 'SECPHONE'  THEN 2
            WHEN PHONE_NUMBER_TYPE = 'HOME'      THEN 3
            WHEN PHONE_NUMBER_TYPE = 'CELLPHONE' THEN 4
            WHEN PHONE_NUMBER_TYPE = 'WORK'      THEN 5
            WHEN PHONE_NUMBER_TYPE = 'PHONETLO'  THEN 6
            WHEN PHONE_NUMBER_TYPE = 'CIF'       THEN 7
        END as phone_type,
        PHONE_NUMBER
    FROM [spectrum].[dbo].[s_phone_number_e18] e18
    WHERE e18.CUSTOMER_ID IN(38,118888)
    ORDER BY CUSTOMER_ID, phone_type


CUSTOMER_ID phone_type PHONE_NUMBER
    1   38            4        6812060
    2   38            5        4873960
    3   118888        3        6565657
    4   118888        4        5675751
    5   118888        5        7176873

-因此,我能够使用Pivot将以上内容从行转换为列:

    SELECT [CUSTOMER_ID],PRIMPHONE,SECPHONE,HOME,CELLPHONE,WORK,PHONETLO,CIF FROM
    (SELECT customer_id,[PHONE_NUMBER_TYPE], PHONE_NUMBER FROM [spectrum].[dbo].[s_phone_number_e18] e18 wHERE e18.CUSTOMER_ID IN(38,118888)
    ) tab1 
    PIVOT  
    (  
    max(PHONE_NUMBER) For [PHONE_NUMBER_TYPE] IN ([PRIMPHONE],[SECPHONE],[HOME],[CELLPHONE],[WORK],[PHONETLO],[CIF])) AS Tab2  
    ORDER BY Tab2.customer_id


[CUSTOMER_ID] PRIMPHONE SECPHONE HOME   CELLPHONE  WORK     PHONETLO    CIF
38               NULL   NULL     NULL     6812060  4873960   NULL      NULL
118888           NULL   NULL     6565657  5675751  7176873   NULL      NULL

-我面临的挑战是如何按照[]的顺序获得每个客户ID的样子>

WHEN PHONE_NUMBER_TYPE = 'PRIMPHONE' THEN 1
    WHEN PHONE_NUMBER_TYPE = 'SECPHONE'  THEN 2
    WHEN PHONE_NUMBER_TYPE = 'HOME'      THEN 3
    WHEN PHONE_NUMBER_TYPE = 'CELLPHONE' THEN 4
    WHEN PHONE_NUMBER_TYPE = 'WORK'      THEN 5
    WHEN PHONE_NUMBER_TYPE = 'PHONETLO'  THEN 6
    WHEN PHONE_NUMBER_TYPE = 'CIF'       THEN 7

for 1st 3 phone numbers.

最终输出寻找:

[CUSTOMER_ID]   Phone 1   Phone 2  Phone 3
38               6812060  4873960   NULL
118888           6565657  5675751  7176873  

-高度赞赏任何帮助。

这是原始表列:SELECT e18.customer_id,当PHONE_NUMBER_TYPE ='PRIMPHONE'THEN 1时为CASE,当PHONE_NUMBER_TYPE ='SECPHONE'THEN 2时为CASE]]

sql ssms
2个回答
0
投票

尝试一下。我认为这就是您要的权利吗?

CREATE TABLE #T(
    Customer_ID INT
    ,PHONE_NUMBER_TYPE VARCHAR(30)
    ,PHONE_NUMBER INT
)

INSERT INTO #T (
    Customer_ID
    ,PHONE_NUMBER_TYPE
    ,PHONE_NUMBER
)
VALUES
    (38, 'CELLPHONE', 6812060)
    ,(38, 'WORK', 4873960)
    ,(118888, 'HOME', 6565657)
    ,(118888, 'CELLPHONE', 5675751)
    ,(118888, 'WORK', 7176873)


;WITH CTE_T AS (
    SELECT
        e18.customer_id,
        CASE
            WHEN PHONE_NUMBER_TYPE = 'PRIMPHONE' THEN 1
            WHEN PHONE_NUMBER_TYPE = 'SECPHONE'  THEN 2
            WHEN PHONE_NUMBER_TYPE = 'HOME'      THEN 3
            WHEN PHONE_NUMBER_TYPE = 'CELLPHONE' THEN 4
            WHEN PHONE_NUMBER_TYPE = 'WORK'      THEN 5
            WHEN PHONE_NUMBER_TYPE = 'PHONETLO'  THEN 6
            WHEN PHONE_NUMBER_TYPE = 'CIF'       THEN 7
        END as phone_type,
        PHONE_NUMBER
        ,ROW_NUMBER() OVER (PARTITION BY e18.Customer_ID ORDER BY CASE
                                                                        WHEN PHONE_NUMBER_TYPE = 'PRIMPHONE' THEN 1
                                                                        WHEN PHONE_NUMBER_TYPE = 'SECPHONE'  THEN 2
                                                                        WHEN PHONE_NUMBER_TYPE = 'HOME'      THEN 3
                                                                        WHEN PHONE_NUMBER_TYPE = 'CELLPHONE' THEN 4
                                                                        WHEN PHONE_NUMBER_TYPE = 'WORK'      THEN 5
                                                                        WHEN PHONE_NUMBER_TYPE = 'PHONETLO'  THEN 6
                                                                        WHEN PHONE_NUMBER_TYPE = 'CIF'       THEN 7
                                                                    END) AS RN
    FROM #T e18
    WHERE e18.CUSTOMER_ID IN(38,118888)
    AND e18.PHONE_NUMBER IS NOT NULL --only return records that have a phone number
)
--LEFT OUTER JOIN Method (since you only need 3 returns.  You could also pivot it if you want instead of left outer joining.
SELECT 
    T.Customer_ID
    ,T.PHONE_NUMBER AS [Phone 1]
    ,T1.PHONE_NUMBER AS [Phone 2]
    ,T2.PHONE_NUMBER AS [Phone 3]
FROM
    CTE_T T
LEFT OUTER JOIN
    CTE_T T1
    ON T1.Customer_ID = T.Customer_ID
    AND T.RN = T1.RN - 1
LEFT OUTER JOIN
    CTE_T T2
    ON T2.Customer_ID = T.Customer_ID
    AND T.RN = T2.RN - 2
WHERE
    T.RN = 1

0
投票

ROW_NUMBER()非常适合在这种情况下使用。我会做这样的事情:

© www.soinside.com 2019 - 2024. All rights reserved.