最近,在论坛中,遇到了不少比较难的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 王五 */