首页 新闻 会员 周边

求助SQL 两行变一行(或者多行变一行)

0
悬赏园豆:50 [已解决问题] 解决于 2013-05-09 10:49

姓名            电话
张三            12345678
张三            98765432   
李四     88888888



表格中同一人有多个电话号码,怎样写语句能得到下面的效果:
姓名            电话
张三            12345678|98765432

数据可能有多条。不知道这样的sql语句怎么写?

沐雪架构师的主页 沐雪架构师 | 初学一级 | 园豆:67
提问于:2013-03-14 10:37
< >
分享
最佳答案
0

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

收获园豆:10
叶落风行 | 初学一级 |园豆:168 | 2013-03-14 13:34
其他回答(7)
0

用convert或者cast拼接

度郎 | 园豆:3 (初学一级) | 2013-03-14 10:52
0

只能使用游标了

1、先group by按名字列分组,还要创建一个临时表"##tempTable"。

2、再使用游标,里面开两个变量,一个存姓名,一个累加电话号码;

3、当姓名变量改变时,向临时表中执行一条insert,然后清空电话号码变量。

游标参考:http://www.jb51.net/article/17875.htm

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-03-14 11:01
0

先写个函数 

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
收获园豆:5
飞来飞去 | 园豆:2057 (老鸟四级) | 2013-03-14 11:11

这样的子查询会不会有效率影响?

支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-03-14 11:28

@滴答的雨: 已经是我想到的最优解决方案了,虽然确实io开销会大些

支持(0) 反对(0) 飞来飞去 | 园豆:2057 (老鸟四级) | 2013-03-14 11:40
0

如果是sqlites可以用group_concat(tel,'|')

收获园豆:5
志誠 | 园豆:122 (初学一级) | 2013-03-14 12:36
0

这里有另外一个做法

http://www.cnblogs.com/jintan/archive/2009/07/17/1525895.html

 

这个问题因为无论如何都涉及到字符串的拼接,效率可能都不是很高。建议先过滤掉大部分数据,仅对你当前调用有用的数据进行如此的处理。

如果你经常需要做这样的查询,那么我的建议是宁愿用另外一个进程定时地处理这些字符串,也就是在数据库中就保存好

张三            12345678|98765432 

这样的格式,而不是每次去查询

收获园豆:10
陈希章 | 园豆:2538 (老鸟四级) | 2013-03-15 08:44
0

使用FOR XML PATH,可以了解一下这方面的知识,以便你以后再次遇到这样的问题可以立马解决

收获园豆:10
Zachary_Fan | 园豆:762 (小虾三级) | 2013-03-18 11:54
0

什么数据库,sqlserver 05以上可以用 for xml实现,也可以写一个函数来实现

如果是mysql可以直拉用group_concat()

收获园豆:10
gw2010 | 园豆:1487 (小虾三级) | 2013-04-19 10:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册