通过创建新字段合并SQL结果?

时间:2011-07-13 18:11:45

标签: sql pivot

我想拍两张这样的唱片:

Id   Fname  Lname  Email
------------------------------------
1    John   Doe    jdoe@example.com
2    John   Doe    doej1@place.net

并将它们组合在一起,我只有一条记录:

Id   Fname  Lname Email1            Email2
---------------------------------------------------
1    John   Doe   jdoe@example.com  doej@place.net

正如您所看到的,这会在我的记录中添加一个字段,否则数据库中就不存在该字段。这是可能的,还是我必须找到另一种方式?

注意:我无法以任何方式更改数据库结构。

4 个答案:

答案 0 :(得分:2)

数据库产品和版本在这里完全不同。假设您正在使用支持排名功能的东西(例如SQL Server 2005 +)

Select FName, LName
    , Min( Case When Rnk = 1 Then Z.Email End ) As Email1
    , Min( Case When Rnk = 2 Then Z.Email End ) As Email2
From    (
        Select FName, LName, Email
            , Row_Number() Over ( Partition By FName, LName Order By Id ) As Rnk
        From MyTable
        ) As Z
Group By Z.FName, Z.LName

如果您没有使用支持排名功能的产品(例如MySQL),那么它就更棘手了。一个应该适用于几乎所有数据库系统的解决方案是:

Select FName, LName
    , Min( Case When Rnk = 1 Then Z.Email End ) As Email1
    , Min( Case When Rnk = 2 Then Z.Email End ) As Email2
From    (
        Select FName, LName, Email
            , (Select Count(*)
                From MyTable As T2
                Where T1.FName = T2.FName
                    And T2.LName = T2.LName
                    And T2.Id < T1.Id) + 1 As Rnk
        From MyTable As T1
        ) As Z
Group By Z.FName, Z.LName

答案 1 :(得分:0)

如果您使用的是SQL Server,请参阅此文章:http://support.microsoft.com/kb/175574

它有一个不同数据的例子,但任务是一样的。您通常可以通过在Google或Bing上搜索“旋转表[rdbmstype]”来查找其他RDBMS的示例

答案 2 :(得分:0)

    select x.Id as ID, x.Fname as Fname, x.Lname as Lname, x.Email as Email1, y.Email as email2 from
        (select id, fname, lname, email from table) as x inner join
        (select id, email from table) as y on x.id = y.id and x.email != y.email

可能效率不高,但它可以完成工作。

答案 3 :(得分:0)

在MySQL中,您可以使用GROUP_CONCAT()

SELECT Fname, Lname, GROUP_CONCAT(email) emails
FROM tbl
GROUP BY Fname, Lname;

如果您需要在单独的字段中添加电子邮件,则可以在编程环境中分割生成的emails字符串(如PHP中的explode(',', $result['emails'])),或使用自联接(仅适用于2个电子邮件字段):

SELECT a.Fname, a.Lname, a.Email Email1, b.email Email2
FROM tbl a JOIN tbl b ON a.Fname = b.Fname AND a.Lname = b.Lname AND a.Email != b.Email

添加装置:

GROUP BY CONCAT(GREATEST(Email1,Email2),LEAST(Email1,Email2))

摆脱重复的电子邮件对。