有两个表:
A B C D
aa 。 。 。
ab 。 。 。
E A
1 aa
1 aa
1 aa
2 aa
2 aa
2 ab想得到这样的表
A B C D F
aa 。 。 。 1,2
ab 。 。 。 2
请问怎么写这个sql?
A B C D
aa 。 。 。
ab 。 。 。
E A
1 aa
1 aa
1 aa
2 aa
2 aa
2 ab想得到这样的表
A B C D F
aa 。 。 。 1,2
ab 。 。 。 2
请问怎么写这个sql?
http://blog.csdn.net/xys_777/archive/2010/07/07/5718036.aspx
IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb
GO
CREATE TABLE tb
(
a varchar(10),
b varchar(10),
c varchar(10),
d varchar(10)
)
GO
INSERT TB
SELECT 'aa' ,'。', '。','。' union all
SELECT 'ab' ,'。', '。','。'
goIF OBJECT_ID('tb1') IS NOT NULL DROP TABLE tb1
GO
CREATE TABLE tb1
(
e int,
a varchar(10)
)
GO
INSERT TB1
SELECT 1,'aa' union all
SELECT 1,'aa' union all
SELECT 1,'aa' union all
SELECT 2,'aa' union all
SELECT 2,'aa' union all
SELECT 2,'ab'
go
--查询--2000
IF OBJECT_ID('f_str') IS NOT NULL DROP function f_str
GO
create function dbo.f_str(@a varchar(10)) returns varchar(100)
as
begin
declare @str varchar(1000)
set @str = ''
select @str = @str + ',' + cast( e as varchar) from (select distinct * from tb1) t where a = @a
set @str = right(@str , len(@str) - 1)
return @str
end
go--调用函数
select a.* , f = dbo.f_str(a.a) from tb a left join (select distinct * from tb1 )b on a.a=b.a group by a.a,a.b,a.c,a.d
--结果
/*
a b c d f
---------- ---------- ---------- ---------- ----------------------------------------------------------------------------------------------------
aa 。 。 。 1,2
ab 。 。 。 2(2 行受影响)*/
select a.*, f = stuff((select ',' + cast( e as varchar)
from (select distinct * from tb1 ) t
where a = a.a for xml path('')) , 1 , 1 , '')
from tb a left join (select distinct * from tb1 )b on a.a=b.a
group by a.a,a.b,a.c,a.d/*
a b c d f
---------- ---------- ---------- ---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
aa 。 。 。 1,2
ab 。 。 。 2(2 行受影响)
*/
create table tb(A varchar(2), B varchar(10))
insert into tb values( 'aa','AA')
insert into tb values( 'ab','AB')create table tb2(E int, A varchar(2))
insert into tb2 values( 1,'aa')
insert into tb2 values( 1,'aa')
insert into tb2 values( 2,'aa')
insert into tb2 values( 2,'aa')
insert into tb2 values( 2,'ab')
go
select t1.*,t2.E FROM tb t1 left join (
select A, [E]=stuff((select DISTINCT ','+CONVERT(VARCHAR(2),[E]) from tb2 t where A=tb2.A for xml path('')), 1, 1, '')
from tb2
group by A) t2 on t1.A = t2.Adrop table tb
drop table tb2
(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)(1 行受影响)
A B E
---- ---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
aa AA 1,2
ab AB 2(2 行受影响)