Sql 同一行中的数据

Sql 同一行中的数据,sql,Sql,我有一张桌子 ID Contact_Details Pref 1 1234567890 A 1 test@test.com A 2 1234567891 A 2 test1@test.com B 简单的select查询无法解决此问题 select contact_details as mobile,contact_details as email from table where pref in (A,B); 我想

我有一张桌子

ID  Contact_Details   Pref
1   1234567890         A 
1   test@test.com      A
2   1234567891         A
2   test1@test.com     B
简单的select查询无法解决此问题

select contact_details as mobile,contact_details as email 
from table 
where pref in (A,B);
我想要这样的结果:

ID Mobile      Pref  Email           Pref
1  1234567890   A    test@test.com    A
2  1234567891   A    test@test.com    B
请注意,对于电子邮件和手机,我有不同的pref,我希望在输出中有不同的pref。

您可以写:

    DECLARE @Table TABLE (ID int, [Contact_Details] nvarchar(200), Pref char(1));
    INSERT INTO @Table (ID,[Contact_Details], Pref)
    VALUES 
            (1,'1234567890', 'A') 
           ,(1,'test@test.com', 'A')
           ,(2,'1234567891','A')
           ,(2,'test1@test.com','B');

    WITH Emails
    AS (
    SELECT ID, [Contact_Details], Pref
    FROM 
    @Table
    WHERE CHARINDEX('@',[Contact_Details])>0
    )
    , Mobils
    AS (
    SELECT ID, [Contact_Details], Pref
    FROM 
    @Table
    WHERE CHARINDEX('@',[Contact_Details])<1
    )
    SELECT ISNULL(Mobils.ID,Emails.ID) AS ID, Mobils.[Contact_Details] AS Mobile,Mobils.Pref AS PrefMobile, Emails.[Contact_Details] AS Email,  Emails.Pref AS PrefEmail
    FROM Mobils 
    FULL OUTER JOIN Emails
    ON Mobils.ID=Emails.Id
select t1.ID, t1.Contact_Details as Mobile, t1.Pref as PrefMobile,
       t2.Contact_Details as Email, t2.Pref as PrefEmail
from Table t1
inner join Table t2
on t1.ID = t2.ID
where t1.Contact_Details not like '%@%'
and t2.Contact_Details like '%@%'

类似这样的方法会奏效:

SELECT Id,
       MAX(CASE WHEN Contact_Details NOT LIKE '%@%' THEN Contact_Details END) as Mobile,
       MAX(CASE WHEN Contact_Details NOT LIKE '%@%' THEN Pref END) as MobilePref,
       MAX(CASE WHEN Contact_Details LIKE '%@%' THEN Contact_Details END) as EMAil,
       MAX(CASE WHEN Contact_Details LIKE '%@%' THEN Pref END) as EMailPref
FROM T
GROUP BY ID

哪个数据库管理系统?sql server、oracle、mysql@Moudiz为什么不呢?它将处理给定的样本数据,但不会返回缺少手机或电子邮件的行。您需要一个
完全连接
,这反过来需要将
t2
别名上的类似条件移动到
连接
条件。我没有注意到id不是唯一的。这样它就可以工作了。@a_horse_和_no_name我相信这两个字段都是必须输入的。@Rajesh很高兴我能提供帮助。没有指定dbms的问题的特定于产品的答案。至少告诉我们这是针对哪个dbms的。我的答案是针对MS Sql server 2012的解决方案+
SELECT Id,
       MAX(CASE WHEN Contact_Details NOT LIKE '%@%' THEN Contact_Details END) as Mobile,
       MAX(CASE WHEN Contact_Details NOT LIKE '%@%' THEN Pref END) as MobilePref,
       MAX(CASE WHEN Contact_Details LIKE '%@%' THEN Contact_Details END) as EMAil,
       MAX(CASE WHEN Contact_Details LIKE '%@%' THEN Pref END) as EMailPref
FROM T
GROUP BY ID