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]))-1) as 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+d
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 

浙公网安备 33010602011771号