如何将多行分组为单行

时间:2012-12-29 19:07:26

标签: sql

我有一张表emp有以下数据:

id name phone no
---------------------
1 smith 423-422-5226
1 smith 414-255-5252
2 george 511-522-2525
2 george 524-522-2428

我需要输出为:

1 smith 423-422-5226, 414-255-5252
2 george 511-522-2525, 524-522-2428

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:4)

由于您没有指定您正在使用的RDBMS,因此我假设您正在使用标记中的SQL Server。然后您可以使用FOR XML来执行此操作,如下所示:

SELECT 
  t1.Id,
  t1.name
  STUFF((
    SELECT ', ' + t2.phone_no
    FROM Table1 t2
    WHERE t2.ID   = t1.ID
      AND t2.Name = t1.Name
    FOR XML PATH (''))
  ,1,2,'') AS PhoneNumbers
FROM Table1 t1
GROUP BY t1.Id, 
         t1.Name;

SQL Fiddle Demo

这会给你:

| ID |   NAME |               PHONENUMBERS |
--------------------------------------------
|  1 |  smith | 423-422-5226, 414-255-5252 |
|  2 | george | 511-522-2525, 524-522-2428 |

答案 1 :(得分:2)

这可以用,

完成
**GROUP_CONCAT() for MYSQL,NETEZZA
WM_CONCAT() for ORACLE**

这是您的查询

select id,name, group_concat(phoneno) phoneno
from emp 
group by id,name

相应地使用您的数据库

SQLLiveDemo

示例输出,

ID  NAME    PHONENO
1   smith   423-422-5226,414-255-5252
2   george  511-522-2525,524-522-2428

答案 2 :(得分:2)

如果每个名称最多有两行,则可以执行以下操作:

select id, name, min(phone_no), max(phone_no)
from emp
group by id, name

如果您有更多的电话号码并希望将它们连接到一个字段,则需要一个聚合字符串连接功能。如何执行此操作取决于您使用的SQL的方言和版本。

答案 3 :(得分:0)

select a.id, a.name, a.phoneno, b.phoneno
from emp a
left join emp b on a.id = b.id and a.name = b.name and a.phoneno <> b.phoneno

答案 4 :(得分:0)

Microsoft的Tobias Ternstrom有一个适用于sql server2005及更高版本的解决方法: 请考虑使用AdventureWorks microsoft示例数据库的以下示例:

 SELECT 
        soh.OrderDate
        ,(
            SELECT 
                p.Name + ', '
            FROM Production.Product AS p
            INNER JOIN Sales.SalesOrderDetail AS sod ON p.ProductID = sod.ProductID
            WHERE sod.SalesOrderID = soh.SalesOrderID
            FOR XML PATH(''), TYPE
         ).value('/', 'NVARCHAR(max)') AS ProductsOrdered
    FROM Sales.SalesOrderHeader AS soh

在这里查看他们讨论相同问题的位置: string aggregate function, something like SUM for numbers