我有一张表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
任何人都可以帮助我吗?
答案 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;
这会给你:
| 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
相应地使用您的数据库
示例输出,
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