我有一个表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
谁能帮我?
我有一个表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
谁能帮我?
由于您没有指定您使用的是什么 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 |
这可以做到,
**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
如果每个名称最多有两行,则可以执行以下操作:
select id, name, min(phone_no), max(phone_no)
from emp
group by id, name
如果您有更多电话号码并希望将它们连接到一个字段中,则需要一个聚合字符串连接函数。如何执行此操作取决于您使用的 SQL 方言和版本。
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
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