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]]
尝试一下。我认为这就是您要的权利吗?
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
ROW_NUMBER()非常适合在这种情况下使用。我会做这样的事情: