Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 一行中的一对多结果(例如电子邮件)_Sql_Pivot - Fatal编程技术网

Sql 一行中的一对多结果(例如电子邮件)

Sql 一行中的一对多结果(例如电子邮件),sql,pivot,Sql,Pivot,我在多个表中基本上有以下数据: ID Name Email 1 Jack jack@hotmail.com 1 Jack jack@gmail.com 2 Jill jill@home.net 2 Jill jill@mail.com 2 Jill jill@gmail.com 我如何进行一个简单的SQL查询,以便在一行中为每个唯一的ID获取以下结果,如下所示 ID Name Email1

我在多个表中基本上有以下数据:

ID  Name    Email
1   Jack    jack@hotmail.com
1   Jack    jack@gmail.com
2   Jill    jill@home.net
2   Jill    jill@mail.com
2   Jill    jill@gmail.com

我如何进行一个简单的SQL查询,以便在一行中为每个唯一的ID获取以下结果,如下所示

            ID  Name    Email1              Email2          Email3
            1   Jack    jack@hotmail.com    jack@gmail.com
            2   Jill    jill@home.net       jill@mail.com   jill@gmail.com


感谢您的帮助。

您可以使用带有
行号()的条件聚合来枚举电子邮件:

select id, name,
       max(case when seqnum = 1 then email end) as email1,
       max(case when seqnum = 2 then email end) as email2,
       max(case when seqnum = 3 then email end) as email3
from (select t.*,
             row_number() over (partition by id order by email) as seqnum
      from t
     ) t
group by id, name;

如果实际上不需要为每封电子邮件增加列,但希望每个ID/名称有一行,则可以使用for XML PATH连接。这会将所有电子邮件添加到同一列中。如果他们有一封电子邮件,该字段将只显示一封。如果他们有7封电子邮件,它将在一个字段中显示所有7封电子邮件

SELECT  
    ID, Name,
    Emails = STUFF((SELECT ',' + Email
    FROM [EmailTable] u2
    WHERE u.ID = u2.ID
    FOR XML PATH('')), 1, 1,'')
FROM [EmailTable] u
group by ID, Name

您使用的是哪种数据库管理系统?如果有人添加了第四封吉尔电子邮件,您是否突然想要在结果中添加Email4列?您如何知道
jill@home.net
是否属于Email1?为什么它没有出现在Email3中,带有
jill@gmail.com
是否在Email1中?