从TB1的到TB2的查询怎样写?
TB1
产品编码 中文名称 拉手 数量
TV2160YSO 两门电视柜 H001 20
BT2160YSO 床头柜 H001 10
BT2160YSO 床头柜 H002 40
ARM22160YSO 两门大衣柜 H002 10
ARM22160YSO 两门大衣柜 H004 20
ARM22160YSO 两门大衣柜 H003 10
ARM22160YSO 两门大衣柜 H005 20
BC2160YSO 行李架 H004 10TB2
产品编码 中文名称 拉手 数量
TV2160YSO 两门电视柜 H001 20
BT2160YSO 床头柜 H001,H002 10,40
ARM22160YSO 两门大衣柜 H002,H004,H003,H005 10,20,10,20
BC2160YSO 行李架 H004 10
TB1
产品编码 中文名称 拉手 数量
TV2160YSO 两门电视柜 H001 20
BT2160YSO 床头柜 H001 10
BT2160YSO 床头柜 H002 40
ARM22160YSO 两门大衣柜 H002 10
ARM22160YSO 两门大衣柜 H004 20
ARM22160YSO 两门大衣柜 H003 10
ARM22160YSO 两门大衣柜 H005 20
BC2160YSO 行李架 H004 10TB2
产品编码 中文名称 拉手 数量
TV2160YSO 两门电视柜 H001 20
BT2160YSO 床头柜 H001,H002 10,40
ARM22160YSO 两门大衣柜 H002,H004,H003,H005 10,20,10,20
BC2160YSO 行李架 H004 10
select [产品编码],[中文名称],
stuff((select ','+[拉手] from tb1 where [产品编码]=t.[产品编码] and [中文名称]=t.[产品编码] for xml path('')),1,1,'') [拉手],
stuff((select ','+ltrim([数量]) from tb1 where [产品编码]=t.[产品编码] and [中文名称]=t.[产品编码] for xml path('')),1,1,'') [数量]
from tb1 t
group by [产品编码],[中文名称];
标题:按某字段合并字符串之一(简单合并)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间: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
create table TB(产品编码 nvarchar(20),中文名称 nvarchar(20),拉手 varchar(10),数量 int)
insert into tb values('TV2160YSO' , N'两门电视柜' ,'H001', 20)
insert into tb values('BT2160YSO' , N'床头柜' ,'H001', 10)
insert into tb values('BT2160YSO' , N'床头柜' ,'H002', 40)
insert into tb values('ARM22160YSO', N'两门大衣柜' ,'H002', 10)
insert into tb values('ARM22160YSO', N'两门大衣柜' ,'H004', 20)
insert into tb values('ARM22160YSO', N'两门大衣柜' ,'H003', 10)
insert into tb values('ARM22160YSO', N'两门大衣柜' ,'H005', 20)
insert into tb values('BC2160YSO' , N'行李架' ,'H004', 10)
go
create function dbo.f_str1(@产品编码 varchar(20),@中文名称 varchar(20)) returns varchar(50)
as
begin
declare @str varchar(50)
select @str = isnull(@str + ',' , '') + cast(拉手 as varchar) from tb where 产品编码 = @产品编码 and 中文名称 = @中文名称
return @str
end
go
create function dbo.f_str2(@产品编码 varchar(20),@中文名称 varchar(20)) returns varchar(50)
as
begin
declare @str varchar(50)
select @str = isnull(@str + ',' , '') + cast(数量 as varchar) from tb where 产品编码 = @产品编码 and 中文名称 = @中文名称
return @str
end
go--调用函数
select 产品编码 ,中文名称,
拉手 = dbo.f_str1(产品编码,中文名称) ,
数量 = dbo.f_str2(产品编码,中文名称)
from tb group by 产品编码,中文名称drop function dbo.f_str1drop function dbo.f_str2drop table tb/*
产品编码 中文名称 拉手 数量
-------------------- -------------------- -------------------------------------------------- --------------------------------------------------
ARM22160YSO 两门大衣柜 H002,H004,H003,H005 10,20,10,20
BC2160YSO 行李架 H004 10
BT2160YSO 床头柜 H001,H002 10,40
TV2160YSO 两门电视柜 H001 20(所影响的行数为 4 行)*/
--sql 2005
create table TB(产品编码 nvarchar(20),中文名称 nvarchar(20),拉手 varchar(10),数量 int)
insert into tb values('TV2160YSO' , N'两门电视柜' ,'H001', 20)
insert into tb values('BT2160YSO' , N'床头柜' ,'H001', 10)
insert into tb values('BT2160YSO' , N'床头柜' ,'H002', 40)
insert into tb values('ARM22160YSO', N'两门大衣柜' ,'H002', 10)
insert into tb values('ARM22160YSO', N'两门大衣柜' ,'H004', 20)
insert into tb values('ARM22160YSO', N'两门大衣柜' ,'H003', 10)
insert into tb values('ARM22160YSO', N'两门大衣柜' ,'H005', 20)
insert into tb values('BC2160YSO' , N'行李架' ,'H004', 10)
goselect 产品编码, 中文名称,
[拉手] = stuff((select ',' + [拉手] from tb t where 产品编码 = tb.产品编码 and 中文名称 = tb.中文名称 for xml path('')) , 1 , 1 , ''),
[数量] = stuff((select ',' + ltrim([数量]) from tb t where 产品编码 = tb.产品编码 and 中文名称 = tb.中文名称 for xml path('')) , 1 , 1 , '')
from tb
group by 产品编码, 中文名称drop table tb/*
产品编码 中文名称 拉手 数量
-------------------- -------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ARM22160YSO 两门大衣柜 H002,H004,H003,H005 10,20,10,20
BC2160YSO 行李架 H004 10
BT2160YSO 床头柜 H001,H002 10,40
TV2160YSO 两门电视柜 H001 20(4 行受影响)*/
第 2 行: 'xml' 附近有语法错误。
消息 156,级别 15,状态 1,第 3 行
在关键字 'for' 附近有语法错误。
(爱新觉罗.毓华) 佩服
(爱新觉罗.毓华) 佩服