读书人

sql行转列 有两行同样的列想用逗号分

发布时间: 2012-12-17 09:31:40 作者: rapoo

sql行转列 有两行一样的列想用逗号分割在一行显示
例如是这样的,fieldtype:1代表座机 2代表手机
姓名 field fieldtype
李 01058210000 1
王 13512555685 2
李 01052810001 1

想出来这样的效果
姓名 座机 手机
李 01058210000,01052810001
王 13512555685

我现在能出来这样的效果
姓名 座机 手机
李 01058210000
王 13512555685

请问可以实现吗?以下是我的代码


select a.seqno,a.compid,a.name,
max(case b.fieldtype when 1 then field else '''+@blank+''' end) 座机,
max(case b.fieldtype when 2 then field else '''+@blank+''' end) 手机
from table1 a
group by a.name,a.seqno,a.compid

[最优解释]
引用:
姓名 ........ 座机 ....................................................... 手机
李......01058210000,01052810001
王 .....................................................................135125556……

哦,看错了


with tb(姓名,field,fieldtype)
as(
select '李','01058210000',1 union all
select '王','13512555685',2 union all
select '李','01052810001',1)
select 姓名,stuff((select ','+field from tb tb2 where fieldtype=1 and tb2.姓名=tb1.姓名 for xml path('')),1,1,'') 座机,
stuff((select ','+field from tb tb2 where fieldtype=2 and tb2.姓名=tb1.姓名 for xml path('')),1,1,'') 手机 from tb tb1 group by tb1.姓名



[其他解释]

CREATE table #TEMP
(
NAME VARCHAR(10),
TEL VARCHAR(20),
type char(1)
)
insert into #TEMP
SELECT '李', '01058210000', '1' UNION
SELECT '王', '13512555685', '2' UNION
SELECT '李', '01052810001', '1'


--select*fromtb pivot(max(分数)for课程in(语文,数学,物理))a
select NAME , a.[1] as 座机,a.[2] as 手机 from
(
select * from #TEMP
pivot (Max(tel) for [type] in([1],[2])) pvt)a
[其他解释]
--use StudentNew
----使用for xml path
----下边的sql语句可以将属于同组的多行的数据变成一个数据
----结果演示
----CityName用户名
----北京b,d
----上海a,c,e
----create @T1 table(UserID int , UserName nvarchar(50),CityName nvarchar(50));


----insert into @T1 (UserID,UserName,CityName) values (1,'a','上海')
----insert into @T1 (UserID,UserName,CityName) values (2,'b','北京')
----insert into @T1 (UserID,UserName,CityName) values (3,'c','上海')
----insert into @T1 (UserID,UserName,CityName) values (4,'d','北京')
----insert into @T1 (UserID,UserName,CityName) values (5,'e','上海')
--SELECT B.CityName,LEFT(UserList,LEN(UserList)-1) as UserList FROM
--(
--SELECT CityName,
-- (SELECT UserName+',' FROM T1 WHERE CityName=A.CityName FOR XML PATH('')) AS UserList
--FROM T1 A
--GROUP BY CityName
--) as B
这个应该是你需要的吧

[其他解释]
那fieldtype还有意义吗
[其他解释]

引用:
那fieldtype还有意义吗


有啊 座机俩的用逗号相连 手机的还是单独的呀,空格没有分隔开
如果李有手机 ,还是会显示在李的手机列的

姓名 ........ 座机 ....................... 手机
李......01058210000,01052810001
王 .....................................13512555685
[其他解释]
姓名 ........ 座机 ....................................................... 手机
李......01058210000,01052810001
王 .....................................................................13512555685
[其他解释]
用05新出来的关键字 行转列 很容易就解决你的问题 PIVOT,我上面的代码已经测试通过!
[其他解释]
几种不同的行转列 :http://www.52mvc.com/topictag-54.aspx
[其他解释]
引用:
用05新出来的关键字 行转列 很容易就解决你的问题 PIVOT,我上面的代码已经测试通过!


谢谢,但是我测试没有通过
PIVOT这个我得去看一下
[其他解释]
引用:
引用:姓名 ........ 座机 ....................................................... 手机
李......01058210000,01052810001
王 ........................................................……



谢谢,这个可以
我得去研究一下,好多不懂的关键词
[其他解释]
Pivot方法SQL2005以上才有,如果你用的是2000,请升级你的数据库吧。
http://technet.microsoft.com/zh-cn/library/ms177410.aspx
这是TechNet上的用法。
[其他解释]
不好意思 PIVOT 只能聚合统计,刚你那种1列显示2个值 是不行的。
可以采用hjywyj 的方法
[其他解释]
引用:
with tb(姓名,field,fieldtype)
as(
select '李','01058210000',1 union all
select '王','13512555685',2 union all
select '李','01052810001',1)
select 姓名,stuff((select ','+field from tb tb2 where fieldtype=1 and tb2.姓名=tb1.姓名 for xml path('')),1,1,'') 座机,
stuff((select ','+field from tb tb2 where fieldtype=2 and tb2.姓名=tb1.姓名 for xml path('')),1,1,'') 手机 from tb tb1 group by tb1.姓名



这个方法是可以使用的,我也弄懂这些关键字的意思了,也试着往自己的项目里带
但是因为我这是两个表,所以搞的有点混乱,没有弄出来,还请再帮忙看一眼,SQL那个板块的帖子已经结贴了,所以就在这问了
第一个表是用户表 字段有
name contactorId
李 1
王 2
第二个表是类型表就是放电话这些的 字段有
contactorId field fieldtype
李 01058210000 1
王 13512555685 2
李 01052810001 1
还是原来的要求,麻烦再帮忙看看,谢谢
[其他解释]
写错了 第二个表是
contactorId field fieldtype
1 01058210000 1
2 13512555685 2
1 01052810001 1
[其他解释]

with tb(contactorId,field,fieldtype)
as(
select 1,'01058210000',1 union all
select 2,'13512555685',2 union all
select 1,'01052810001',1),
nametable(name, contactorId)
as(select '李',1 union all
select '王',2)
select (select name from nametable where contactorId=tb1.contactorId)姓名,stuff((select ','+field from tb tb2 where fieldtype=1 and tb2.contactorId=tb1.contactorId for xml path('')),1,1,'') 座机,
stuff((select ','+field from tb tb2 where fieldtype=2 and tb2.contactorId=tb1.contactorId for xml path('')),1,1,'') 手机
from tb tb1 group by tb1.contactorId

[其他解释]
引用:
SQL code?123456789101112with tb(contactorId,field,fieldtype)as(select 1,'01058210000',1 union allselect 2,'13512555685',2 union allselect 1,'01052810001',1),nametable(name, contactorId)as……


谢谢大侠 我看一下先

读书人网 >asp.net

热点推荐