2017-10-04 10 views
2

SQL Serverを使用して、1つの列で共有される情報をIDの数に基づいて3つに分割しようとしています。理想的には、私は最後に異なるIDを持っています。SQL Server:さまざまなデータの列を3つの特定の列に分割ID:

連絡先の情報に応じて、PersonIDごとに1-3行があります。

personIDが複数回表示される場合は、データを電話用とメール用の2つの列に分割したいと考えています。

Email列にデータを入れるには「@」記号が含まれ、残りはPhoneまたはAlt 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 

私はにこれを変換したい:あなたは、クエリ以下で同じことを達成することができ、人物IDによって行番号とグループを使用して

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

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 

出力私は実際にそのtime.Iで私の携帯電話から、それに答え

1 Chen 212747  NULL [email protected] 
2 Pudge 18182222 18191 [email protected] 
3 Riki 19192  NULL [email protected] 
4 Lina 18424  NULL NULL 
関連する問題