Как я могу преобразовать их из столбца в строки с первыми 3 телефонными номерами - PullRequest
0 голосов
/ 21 октября 2019
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

- Задача, с которой я сталкиваюсь, состоит в том, как добиться успеха для каждого изИдентификатор клиента, следующий за заказом:

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  

- Любая помощь высоко ценится.

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Попробуйте это. Я думаю, это то, что вы просите правильно?

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 голосов
/ 21 октября 2019

ROW_NUMBER () хорошо использовать в подобных случаях. Я бы сделал что-то вроде этого:

SELECT 
CUSTOMER_ID,
PHONE_NUMBER,
   ROW_NUMBER() OVER (
      PARTITION BY CUSTOMER_ID
      ORDER BY PHONE_NUMBER
   ) row_num
INTO #TEMP
FROM 
   s_phone_number_e18
ORDER BY 
   CUSTOMER_ID;


SELECT t1.CUSTOMER_ID, t1.PHONE_NUMBER, t2.PHONE_NUMBER, t3.PHONE_NUMBER
FROM #TEMP t1
LEFT JOIN #TEMP t2 ON t1.CUSTOMER_ID = t2.CUSTOMER_ID
LEFT JOIN #TEMP t3 ON t1.CUSTOMER_ID = t2.CUSTOMER_ID
WHERE t1.row_num = 1 and t2.row_num = 2 and t3.row_num = 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...