姓名 电话
张三 12345678
张三 98765432
李四 88888888
表格中同一人有多个电话号码,怎样写语句能得到下面的效果:
姓名 电话
张三 12345678|98765432
数据可能有多条。不知道这样的sql语句怎么写?
SELECT B.姓名,LEFT(telList,LEN(telList)-1) as 电话 FROM (
SELECT 姓名,
(SELECT 电话+'|' FROM person
WHERE 姓名=A.姓名
FOR XML PATH('')) AS telList
FROM person A
GROUP BY 姓名
) B
下面也可以
select distinct 姓名,电话=substring((select '|'+电话 from person where 姓名=p.姓名 for xml path('')),2,100) from person p
用convert或者cast拼接
只能使用游标了
1、先group by按名字列分组,还要创建一个临时表"##tempTable"。
2、再使用游标,里面开两个变量,一个存姓名,一个累加电话号码;
3、当姓名变量改变时,向临时表中执行一条insert,然后清空电话号码变量。
先写个函数
create function com_userinfo(@userid int) return nvarchar(1000) as begin declare @tmp nvarchar(1000) set @tmp='' select @tmp=@tmp+phone+'|' from users where userid=@userid return @tmp end
然后
select userid,username,com_userinfo(userid) from users group by userid,username
这样的子查询会不会有效率影响?
@滴答的雨: 已经是我想到的最优解决方案了,虽然确实io开销会大些
如果是sqlites可以用group_concat(tel,'|')
这里有另外一个做法
http://www.cnblogs.com/jintan/archive/2009/07/17/1525895.html
这个问题因为无论如何都涉及到字符串的拼接,效率可能都不是很高。建议先过滤掉大部分数据,仅对你当前调用有用的数据进行如此的处理。
如果你经常需要做这样的查询,那么我的建议是宁愿用另外一个进程定时地处理这些字符串,也就是在数据库中就保存好
张三 12345678|98765432
这样的格式,而不是每次去查询
使用FOR XML PATH,可以了解一下这方面的知识,以便你以后再次遇到这样的问题可以立马解决
什么数据库,sqlserver 05以上可以用 for xml实现,也可以写一个函数来实现
如果是mysql可以直拉用group_concat()