原始表:COL1 COL2 COL3
A 1 101
A 2 201
A 3 301
A 3 302
A 4 401
A 4 402
A 4 403
B 1 101
B 2 201
B 3 301
B 4 401转换后的结果应为:
COL1 COL2
A 101,201,301或302,401或402或403
B 101,201,301,401说明:COL3的值是我自己随便输入的值,这里只是为了方便;COL2的值只能是1-4;但COL1、COL2、COL3的同一行的组合值肯定唯一;
要求是:将COL1中相同的值组合成一条数据,并且如果COL1中的值相同且COL2值也同,则要用“或”字将它们连接起来;总体的排列顺序是COL1,COL2,COL3。
谢谢,如果能用SQL来直接解决最好,闲分不够我再另外开贴谢谢。
A 1 101
A 2 201
A 3 301
A 3 302
A 4 401
A 4 402
A 4 403
B 1 101
B 2 201
B 3 301
B 4 401转换后的结果应为:
COL1 COL2
A 101,201,301或302,401或402或403
B 101,201,301,401说明:COL3的值是我自己随便输入的值,这里只是为了方便;COL2的值只能是1-4;但COL1、COL2、COL3的同一行的组合值肯定唯一;
要求是:将COL1中相同的值组合成一条数据,并且如果COL1中的值相同且COL2值也同,则要用“或”字将它们连接起来;总体的排列顺序是COL1,COL2,COL3。
谢谢,如果能用SQL来直接解决最好,闲分不够我再另外开贴谢谢。
解决方案 »
- 关于sql server的count
- 如何在客户端将EXCEL中的数据导入到SQL数据库中?
- 求一条sql语句,想了一下午都没想出来,请各位大侠帮帮忙
- SQL Server 2008无法启动实例,报错无法打开明确指定的数据库
- 数据库恢复的问题
- How to delete Ms Sql desktop engine databases?
- 大侠,大侠,sql server,有问题相求
- delphi到sql server怎么导?
- java设计ATM系统的数据库表格添加问题
- 请教SQL xquery语句写法
- 简单问题让你轻松得分(查询两个表记录)
- 那位大侠帮助看一下,在sqlserver2005中获得表结构的语句
--生成测试数据
create table 表(部门 int,人员 varchar(20))
insert into 表 select 1,'张三'
insert into 表 select 1,'李四'
insert into 表 select 1,'王五'
insert into 表 select 2,'赵六'
insert into 表 select 2,'邓七'
insert into 表 select 2,'刘八'
go--创建用户定义函数
create function f_str(@department int)
returns varchar(8000)
as
begin
declare @ret varchar(8000)
set @ret = ''
select @ret = @ret+','+人员 from 表 where 部门 = @department
set @ret = stuff(@ret,1,1,'')
return @ret
end
go
--执行
select 部门,人员=dbo.f_str(部门) from 表 group by 部门 order by 部门
go--输出结果
/*
部门 人员
---- --------------
1 张三,李四,王五
2 赵六,邓七,刘八
*/
--删除测试数据
drop function f_str
drop table 表
go
不知道还没有其它办法,比如直接的SQL语句或者分解的SQL语句最好针对我的例子
Create Table TEST
(COL1 Char(1),
COL2 Int,
COL3 Int)
Insert TEST Select 'A', 1, 101
Union All Select 'A', 2, 201
Union All Select 'A', 3, 301
Union All Select 'A', 3, 302
Union All Select 'A', 4, 401
Union All Select 'A', 4, 402
Union All Select 'A', 4, 403
Union All Select 'B', 1, 101
Union All Select 'B', 2, 201
Union All Select 'B', 3, 301
Union All Select 'B', 4, 401
GO
Create Function GetCOL3(@COL1 Char(1))
Returns Nvarchar(4000)
As
Begin
Declare @S Nvarchar(4000),@S1 Nvarchar(4000),@S2 Nvarchar(4000),@S3 Nvarchar(4000),@S4 Nvarchar(4000)
Select @S='',@S1='',@S2='',@S3='',@S4=''
Select @S1=@S1+N'或'+Rtrim(COL3) From TEST Where COL1=@COL1 And COL2=1
Select @S2=@S2+N'或'+Rtrim(COL3) From TEST Where COL1=@COL1 And COL2=2
Select @S3=@S3+N'或'+Rtrim(COL3) From TEST Where COL1=@COL1 And COL2=3
Select @S4=@S4+N'或'+Rtrim(COL3) From TEST Where COL1=@COL1 And COL2=4
Select @S=Stuff(@S1,1,1,'')+','+Stuff(@S2,1,1,'')+','+Stuff(@S3,1,1,'')+','+Stuff(@S4,1,1,'')
Return @S
End
GO
Select
COL1,
dbo.GetCOL3(COL1) As COL2
From TEST
Group By COL1
GO
Drop Table TEST
Drop Function GetCOL3
GO
/*
COL1 COL2
A 101,201,301或302,401或402或403
B 101,201,301,401
*/
Returns Nvarchar(4000)
As
Begin
Declare @S Nvarchar(4000),@S1 Nvarchar(4000),@S2 Nvarchar(4000),@S3 Nvarchar(4000),@S4 Nvarchar(4000)
Select @S='',@S1='',@S2='',@S3='',@S4=''
Select @S1=@S1+N'或'+Rtrim(COL3) From TEST Where COL1=@COL1 And COL2=1
Select @S2=@S2+N'或'+Rtrim(COL3) From TEST Where COL1=@COL1 And COL2=2
Select @S3=@S3+N'或'+Rtrim(COL3) From TEST Where COL1=@COL1 And COL2=3
Select @S4=@S4+N'或'+Rtrim(COL3) From TEST Where COL1=@COL1 And COL2=4
Select @S=Stuff(@S1,1,1,'')+','+Stuff(@S2,1,1,'')+','+Stuff(@S3,1,1,'')+','+Stuff(@S4,1,1,'')
Return @S
End
之後查詢時,只需執行以下語句即可
Select
COL1,
dbo.GetCOL3(COL1) As COL2
From TEST
Group By COL1
paoluo(一天到晚游泳的鱼) :我测试了,如果对于每一个COL1的值都有COL2的1、2、3、4的值的时候,完全正确,正是我需要的那种类型。但有个问题是,如果上述条件不满足,即COL2有可能只有2和3,也可能只有1和2和3的情况,就不正确了,最后的值是NULL。
还请您帮忙修改一下,谢谢。
(COL1 Char(1),
COL2 Int,
COL3 Int)
Insert TEST Select 'A', 1, 101
Union All Select 'A', 2, 201
Union All Select 'A', 3, 301
Union All Select 'A', 3, 302
Union All Select 'A', 4, 401
Union All Select 'A', 4, 402
Union All Select 'A', 4, 403
Union All Select 'B', 1, 101
Union All Select 'B', 2, 201
Union All Select 'B', 3, 301
Union All Select 'B', 4, 401
Union All Select 'C', 1, 101
Union All Select 'C', 2, 201
Union All Select 'C', 3, 301
Union All Select 'C', 3, 302
Union All Select 'D', 3, 301
Union All Select 'D', 4, 401
Union All Select 'D', 4, 402
GO
Create Function GetCOL3(@COL1 Char(1))
Returns Nvarchar(4000)
As
Begin
Declare @S Nvarchar(4000),@S1 Nvarchar(4000),@S2 Nvarchar(4000),@S3 Nvarchar(4000),@S4 Nvarchar(4000)
Select @S='',@S1='',@S2='',@S3='',@S4=''
Select @S1=@S1+N'或'+Rtrim(COL3) From TEST Where COL1=@COL1 And COL2=1
Select @S2=@S2+N'或'+Rtrim(COL3) From TEST Where COL1=@COL1 And COL2=2
Select @S3=@S3+N'或'+Rtrim(COL3) From TEST Where COL1=@COL1 And COL2=3
Select @S4=@S4+N'或'+Rtrim(COL3) From TEST Where COL1=@COL1 And COL2=4
Select @S=IsNull(Stuff(@S1,1,1,'')+',','')+IsNull(Stuff(@S2,1,1,'')+',','')+IsNull(Stuff(@S3,1,1,'')+',','')+IsNull(Stuff(@S4,1,1,''),'')
If Right(@S,1)=','
Select @S=Left(@S,Len(@S)-1)
Return @S
End
GO
Select
COL1,
dbo.GetCOL3(COL1) As COL2
From TEST
Group By COL1
GO
Drop Table TEST
Drop Function GetCOL3
GO
/*
COL1 COL2
A 101,201,301或302,401或402或403
B 101,201,301,401
C 101,201,301或302
D 301,401或402
*/