2017-10-04 36 views
2

使用SQL Server,我試圖根據ID的數量將一列中共享的信息拆分爲三個。理想情況下,我最終會有不同的ID。SQL Server:將具有不同數據的列拆分爲ID分組的3個特定列

取決於聯繫人列中的信息,每個PersonID可以有1-3行。

如果personID出現不止一次,我希望將數據分成兩列,一列用於電話,另一列用於發送電子郵件。

我需要檢查數據是否包含一個「@」符號,以便將其放入Email列,其餘放入PhoneAlt Phone

這很難解釋,所以如果您需要更多的信息,請評論。

希望下面的例子將幫助:

PersonID Name Contact 
---------------------------------------- 
1   Chen 212747 
1   Chen [email protected] 
2   Pudge 18191 
2   Pudge 18182222 
2   Pudge [email protected] 
3   Riki [email protected] 
3   Riki 19192 
4   Lina 18424 

我想這個轉換爲:

PersonID Name Phone Alt Phone Email 
-------------------------------------------------------- 
1   Chen 212747 NULL  [email protected] 
2   Pudge 18191 18182222 [email protected] 
3   Riki 19192 NULL  [email protected] 
4   Lina 18424 NULL  NULL 

回答

2
declare @Table AS TABLE 
(
    PersonID INT , 
    Name VARCHAR(100), 
    Contact VARCHAR(100) 
) 
INSERT @Table 
     (PersonID, Name, Contact) 
VALUES 
(1   ,'Chen','212747'), 
(1   ,'Chen','[email protected]'), 
(2   ,'Pudge','18191'), 
(2   ,'Pudge','18182222'), 
(2   ,'Pudge','[email protected]'), 
(3   ,'Riki','[email protected]'), 
(3   ,'Riki','19192'), 
(4   ,'Lina','18424') 

SELECT 
    xQ.PersonID, 
    xQ.Name, 
    MAX(CASE WHEN xQ.IsEmail = 0 AND xQ.RowNumberPhone = 1 THEN xQ.Contact ELSE NULL END) AS Phone, 
    MAX(CASE WHEN xQ.IsEmail = 0 AND xQ.RowNumberPhone = 2 THEN xQ.Contact ELSE NULL END) AS [Alt Phone], 
    MAX(CASE WHEN xQ.IsEmail = 1 AND xQ.RowNumberEmail = 1 THEN xQ.Contact ELSE NULL END) AS Email 
FROM 
(
    SELECT * 
     ,CASE WHEN PATINDEX('%@%',T.Contact)>0 THEN 1 ELSE 0 END AS IsEmail 
     ,RANK() OVER(PARTITION BY T.PersonID, CASE WHEN PATINDEX('%@%',T.Contact)=0 THEN 1 ELSE 0 END ORDER BY T.Contact) AS RowNumberPhone 
     ,RANK() OVER(PARTITION BY T.PersonID, CASE WHEN PATINDEX('%@%',T.Contact)>0 THEN 1 ELSE 0 END ORDER BY T.Contact) AS RowNumberEmail 
    FROM @Table AS T 
)AS xQ 
GROUP BY 
    xQ.PersonID, 
    xQ.Name 
ORDER BY xQ.PersonID 
+0

非常感謝你,這似乎正是我所需要的 – TLCONE

+0

@TLCONE p租賃,請閱讀此規則https://stackoverflow.com/help/someone-answers,避免表示感謝,請將此答案標記爲正確,併爲幫助您的其他人添加+1。 –

2

被人ID使用行號和組可以實現通過下面的查詢相同。

Select PersonID, max(Name) name, 
     max(case when rn=1 and contact not like '%@%' then contact end) phone, 
     max(case when rn=2 and contact not like '%@%' then contact end) Alt_Phone, 
     max(case when contact like '%@%' then contact end) mailid 
    from(select t.*, row_number() over(partition by personid order by contact) as rn from table t) as t2 
    group by PersonID 
+0

@VictorHugoTerceros其實我的答案是從我的手機在再寄一次再次編輯它這樣做,它 – Rams

+0

現在它是如何彈性的 –

2

可以使用子查詢

declare @tbl table(PersonID int,Name varchar(50),Contact varchar(100)) 
insert into @tbl 
select 1,'Chen','212747' union 
select 1,'Chen','[email protected]' union 
select 2,'Pudge','18191' union 
select 2,'Pudge','18182222' union 
select 2,'Pudge','[email protected]' union 
select 3,'Riki','[email protected]' union 
select 3,'Riki','19192' union 
select 4,'Lina','18424' 

SELECT DISTINCT 
M.PersonID 
,M.Name 
,(SELECT TOP 1 Contact FROM @tbl WHERE PersonID = M.PersonID AND Contact NOT LIKE '%@%' ORDER BY Contact) AS Phone 
,(SELECT TOP 1 Contact FROM @tbl WHERE PersonID = M.PersonID AND Contact NOT LIKE '%@%' 
    AND Contact NOT IN (SELECT TOP 1 Contact FROM @tbl WHERE PersonID = M.PersonID AND Contact NOT LIKE '%@%' ORDER BY Contact)) AS AltPhone 
,(SELECT TOP 1 Contact FROM @tbl WHERE PersonID = M.PersonID AND Contact LIKE '%@%') AS Email 
FROM @tbl M 

輸出

1 Chen 212747  NULL [email protected] 
2 Pudge 18182222 18191 [email protected] 
3 Riki 19192  NULL [email protected] 
4 Lina 18424  NULL NULL