当前位置: 代码迷 >> SQL >> 在论坛中出现的比较难的sql有关问题:26(动态行专列+合并字符串)
  详细解决方案

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

热度:14   发布时间:2016-05-05 11:40:25.0
在论坛中出现的比较难的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的系统。


这个问题,由于不能用函数,这里我通过分组求max,然后再相加的方法来处理字符串的累加问题。

我的方法:

create table A(id  int, 车号 varchar(20))insert into a    select 1      ,'辽A1111' union allselect 2      ,'辽B2222'create table B(id int,A_id int,   车号 varchar(10),箱号 varchar(10), 封号 varchar(10),客户 varchar(10))insert into BSELECT 1,1,'辽A1111','001','001','张三' UNION ALLSELECT 2,1,'辽A1111','002','002','李四' UNION ALLSELECT 3,2,'辽B2222','003','003','王五'goif OBJECT_ID('tempdb..#temp') is not null  drop table #tempselect *,       (select count(*) from B where t.A_id = b.A_id and t.id>=b.id) rn       into #tempfrom B tdeclare @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 #tempgroup by rnselect @sql_t = @sql_t + '+max(case when rn ='+CAST(rn as varchar)+' then ''/''+客户 else '''' end)'from #tempgroup by rnset @sql = 'select a_id as id,[email protected] + ',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			王五*/  

生成的动态语句:

select a_id as id,       车号,              max(case when rn =1 then 箱号 else '' end) 箱号,       max(case when rn =1 then 封号 else '' end) 封号,              max(case when rn =2 then 箱号 else '' end) 箱号,       max(case when rn =2 then 封号 else '' end) 封号,              stuff(max(case when rn =1 then '/'+客户 else '' end)+             max(case when rn =2 then '/'+客户 else '' end)             ,1,1,'') as 客户 from #temp               group by a_id,         车号


  相关解决方案