我如何将这些从列转换为具有前 3 phone 个数字的行
How can i convert these from column to rows with first 3 phone numbers
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
--非常感谢任何形式的帮助。
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
试试这个。我想这就是你要的吧?
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
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
--我面临的挑战是如何按照
的顺序获取每个客户 IDWHEN 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
--非常感谢任何形式的帮助。
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
试试这个。我想这就是你要的吧?
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