两表横向联合的sql问题
有两个表:
表A:
id data type
0001 26 AA1
0002 23 AA1
0003 56 AA1
0004 25 AA1
表B:
id data type
0001 24 AA0
0002 26 AA0
0005 23 AA0
0001 26 AA2
0006 26 AA2
其中b表的type可以有多个值,如AA3、AA4、AB1等等
想获得的结果是:
id AA0-data AA1-data AA2-data
0001 24 26 26
0002 26 23
0003 56
0004 25
0005 23
0006 26
即:查询的结果包含了两表的所有的id,并且b表中type有几种值,查询后的列数就是(其值的个数+a表type列中值的个数)。
请问这样的问题有什么办法来实现?
如果一条sql实现不了,还有什么其他的办法呢?或者程序也可。
------解决方案--------------------create table a(id varchar(10),data varchar(10),type varchar(10))
insert into a values( '0001 ', '26 ', 'AA1 ')
insert into a values( '0002 ', '23 ', 'AA1 ')
insert into a values( '0003 ', '56 ', 'AA1 ')
insert into a values( '0004 ', '25 ', 'AA1 ')
create table b(id varchar(10),data varchar(10),type varchar(10))
insert into b values( '0001 ', '24 ', 'AA0 ')
insert into b values( '0002 ', '26 ', 'AA0 ')
insert into b values( '0005 ', '23 ', 'AA0 ')
insert into b values( '0001 ', '26 ', 'AA2 ')
insert into b values( '0006 ', '26 ', 'AA2 ')
go
declare @sql varchar(8000)
set @sql = 'select id '
select @sql = @sql + ' , min(case type when ' ' ' + type + ' ' ' then data end) [ ' + type + '] '
from (select distinct type from (select * from a union all select * from b) m) as t
set @sql = @sql + ' from (select * from a union all select * from b) m group by id '
exec(@sql)
drop table a,b
/*
id AA0 AA1 AA2
---------- ---------- ---------- ----------
0001 24 26