Leadbbs上的一个问题的解决方式

今天在leadbbs上看的如下问题
sql查询问题

tableA:
a_id
1
2
3
tableB:
b_id    b_name a_id
1 a 1
2 b 1
3 c 2
4 d 3
5 e 3
得到下表,该怎么写sql
a_id    b_name
1 a,b
2 c
3 d,e


 


我的解决方式

 

--create table 
create table A(a_id 
int
create table B(b_id 
int identity(1,1),b_name varchar(20),a_id int
--insert data 
insert into A 
select 
1 Union all 
select 
2 Union all 
select 
3 
insert into B 
select 
'a',1 Union all 
select 
'b',1 Union all 
select 
'c',2 Union all 
select 
'd',3 Union all 
select 
'e',3 

--fixed method 

select  a_id,SUBSTRING(([
1]+[2]+[3]+[4]+[5]),1,len(([1]+[2]+[3]+[4]+[5]))-1as Roboth 
from 

SELECT a_id, 
           [
1]=IsNull(MAX(CASE b_name when 'a' then b_name+',' end),''), 
           [
2]=IsNull(MAX(CASE b_name when 'b' then b_name+',' end),''), 
           [
3]=IsNull(MAX(CASE b_name when 'c' then b_name+',' end),''), 
           [
4]=IsNull(MAX(CASE b_name when 'd' then b_name+',' end),''), 
           [
5]=IsNull(MAX(CASE b_name when 'e' then b_name+',' end),''
from B 
group by a_id 

)t 


--Dynamic Method 

DECLARE @s nvarchar(
4000

SET @s
='SELECT a_id' 

SELECT @s
=@s 
+','+QUOTENAME(b_name) 
+N'=IsNull(MAX(CASE b_name WHEN '+QUOTENAME(b_name,N''''
+N' THEN b_name+'','' END),'''')' 
FROM B 
group by b_name 

print @s 




--a+b+c+
DECLARE @s1 nvarchar(
4000
SET @s1
='' 
select @s1
=@s1+ 
QUOTENAME(b_name)
+'+' 
from B 
group by b_name 
SET @s1
= SUBSTRING(@s1,1,LEN(@s1)-1


print @s1 

execute(
'select  a_id, Substring('+@s1+',1,len('+@s1+')-1) as Roboth  from ('+@s+' from B group by a_id ) t'


drop table A 
drop table B 
posted @ 2007-09-26 14:44  roboth  阅读(284)  评论(0)    收藏  举报