0

我有一个表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

谁能帮我?

4

5 回答 5

5

由于您没有指定您使用的是什么 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 小提琴演示

这会给你:

| ID |   NAME |               PHONENUMBERS |
--------------------------------------------
|  1 |  smith | 423-422-5226, 414-255-5252 |
|  2 | george | 511-522-2525, 524-522-2428 |
于 2012-12-29T19:22:47.807 回答
3

这可以做到,

**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
于 2012-12-29T19:14:25.140 回答
3

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

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

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

于 2012-12-29T19:17:59.850 回答
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
于 2012-12-29T19:11:42.310 回答
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

看看他们在哪里讨论同样的问题: 字符串聚合函数,类似于数字的 SUM

于 2012-12-29T19:24:47.773 回答