在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串)

最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。



1、sql 合并id相同的数据 

http://bbs.csdn.net/topics/390726775
表A:
id     车号    
1      辽A1111
2      辽B2222
表B:
id      表A_id   车号     箱号   封号    客户
1        1       辽A1111  001   001    张三
2        1       辽A1111  002   002    李四
3        2       辽B2222  003   003    王五
   
通过表A的id和表B的 表A_id实现关联,一条表A的数据可以有一个或者两个箱号,一个箱号可能有多个客户,

实现综合查询 组合成一个新表(不使用函数)

 车号        箱号    封号    箱号   封号    客户
 辽A1111     001    001     002   002    张三/李四
 辽B2222     003    003                  王五
 

sql server 2000的系统。


我的方法:

create table A(id  int, 车号 varchar(20))

insert into a    
select 1      ,‘辽A1111‘ union all
select 2      ,‘辽B2222‘


create table B(
id int,A_id int,   
车号 varchar(10),
箱号 varchar(10), 
封号 varchar(10),
客户 varchar(10))

insert into B
SELECT 1,1,‘辽A1111‘,‘001‘,‘001‘,‘张三‘ UNION ALL
SELECT 2,1,‘辽A1111‘,‘002‘,‘002‘,‘李四‘ UNION ALL
SELECT 3,2,‘辽B2222‘,‘003‘,‘003‘,‘王五‘
go


if OBJECT_ID(‘tempdb..#temp‘) is not null
  drop table #temp

select *,
       (select count(*) from B where t.A_id = b.A_id and t.id>=b.id) rn
       into #temp
from B t


declare @sql varchar(4000)
declare @sql_t varchar(4000)

set @sql = ‘‘
set @sql_t = ‘‘

select @sql = @sql + ‘,max(case when rn =‘+CAST(rn as varchar)+‘ then 箱号 else ‘‘‘‘ end) 箱号‘
                   + ‘,max(case when rn =‘+CAST(rn as varchar)+‘ then 封号 else ‘‘‘‘ end) 封号‘
from #temp
group by rn


select @sql_t = @sql_t + ‘+max(case when rn =‘+CAST(rn as varchar)+‘ then ‘‘/‘‘+客户 else ‘‘‘‘ end)‘
from #temp
group by rn



set @sql = ‘select a_id as id,车号‘+@sql + ‘,stuff(‘+stuff(@sql_t,1,1,‘‘)+‘,1,1,‘‘‘‘) as 客户‘+
           ‘ from #temp 
            group by a_id,车号‘
            
exec(@sql)
/*
id	车号	箱号	封号	箱号	封号	客户
1	辽A1111	001	001	002	002	张三/李四
2	辽B2222	003	003			王五
*/  


在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。