定义的合并函数:
create function dbo.f_str(@RQ Datetime,@code nvarchar(50)) returns nvarchar(1000)
as
begin
declare @str varchar(1000)
select @str = isnull(@str + ',' , '') + cast(j_ as nvarchar) from Tb_perday1002 where RQ = @RQ and code=@code
return @str
end
go查询语句如下 :
select PP.RQ,PP.code,PP.sm,PP.j_=dbo.f_str(PP.RQ,PP.a) from
(select RQ ,code,sum(perday) as sm,j_
from Tb_perday1002 T
group by T.RQ,T.code,T.j_) as PP
group by PP.RQ,PP.code运行后出现提示:
消息 170,级别 15,状态 1,第 1 行
第 1 行: '=' 附近有语法错误。
消息 156,级别 15,状态 1,第 3 行
在关键字 'as' 附近有语法错误。在查询中使用f_str 合并函数,不可以吗?
create function dbo.f_str(@RQ Datetime,@code nvarchar(50)) returns nvarchar(1000)
as
begin
declare @str varchar(1000)
select @str = isnull(@str + ',' , '') + cast(j_ as nvarchar) from Tb_perday1002 where RQ = @RQ and code=@code
return @str
end
go查询语句如下 :
select PP.RQ,PP.code,PP.sm,PP.j_=dbo.f_str(PP.RQ,PP.a) from
(select RQ ,code,sum(perday) as sm,j_
from Tb_perday1002 T
group by T.RQ,T.code,T.j_) as PP
group by PP.RQ,PP.code运行后出现提示:
消息 170,级别 15,状态 1,第 1 行
第 1 行: '=' 附近有语法错误。
消息 156,级别 15,状态 1,第 3 行
在关键字 'as' 附近有语法错误。在查询中使用f_str 合并函数,不可以吗?
解决方案 »
- 向有三十万条数据的表更新数据会很慢?
- 求高手指点一条SQL语句
- 请教一个多表连接查询的SQL语句
- 怎么删除数据库重复的数据
- index scan好还是index seek好
- sqlserver2000 中如何连接多个表?
- 还原数据库时已经还原了备份文件*.bak和日志*.trn,可怎么还是*.bak中的日期的数据?
- 请教各位高手,初学者的问题!在线等
- 客户端连接服务器SQL server2000的实例时 提示 连接后报错“server-sql server不存在或拒绝ConnectionOpen(Connect())”(只有一台电脑存在这个问题,其他电脑使用正常)
- 如何访问服务器上Access数据库?
- SQL查询 疑难问题.
- 计算总数
标题:按某字段合并字符串之一(简单合并)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-11-06
地点:广东深圳描述:将如下形式的数据按id字段合并value字段。
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id value
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加)
*/
--1、sql2000中只能用自定义的函数解决
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
gocreate function dbo.f_str(@id varchar(10)) returns varchar(1000)
as
begin
declare @str varchar(1000)
select @str = isnull(@str + ',' , '') + cast(value as varchar) from tb where id = @id
return @str
end
go--调用函数
select id , value = dbo.f_str(id) from tb group by iddrop function dbo.f_str
drop table tb
--2、sql2005中的方法
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
goselect id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
from tb
group by iddrop table tb
--3、使用游标合并数据
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
declare @t table(id int,value varchar(100))--定义结果集表变量
--定义游标并进行合并处理
declare my_cursor cursor local for
select id , value from tb
declare @id_old int , @id int , @value varchar(10) , @s varchar(100)
open my_cursor
fetch my_cursor into @id , @value
select @id_old = @id , @s=''
while @@FETCH_STATUS = 0
begin
if @id = @id_old
select @s = @s + ',' + cast(@value as varchar)
else
begin
insert @t values(@id_old , stuff(@s,1,1,''))
select @s = ',' + cast(@value as varchar) , @id_old = @id
end
fetch my_cursor into @id , @value
END
insert @t values(@id_old , stuff(@s,1,1,''))
close my_cursor
deallocate my_cursorselect * from @t
drop table tb
select
PP.RQ,PP.code,PP.sm,PP.j_=dbo.f_str(PP.RQ,PP.a)
from
(select RQ ,code,sum(perday) as sm,j_ from Tb_perday1002 T group by T.RQ,T.code,T.j_) as PP
group by
PP.RQ,PP.code
as
begin
declare @str varchar(1000)
select @str = isnull(@str,'') + ',' + cast(j_ as nvarchar) from Tb_perday1002 where RQ = @RQ and code=@code
return @str
end
go
PP.RQ,
PP.code,
PP.sm, --PP.sm列没在group中,会报错
j_=dbo.f_str(PP.RQ,PP.a) --别名不能用PP.j_; PP.a列没在group中,会报错
from
(
select
RQ ,
code,
sum(perday) as sm,
j_
from Tb_perday1002 T
group by
T.RQ,
T.code,
T.j_
) as PP
group by --自己理解一下GROUP BY的含义
PP.RQ,
PP.code