sql 合并id相同的数据

mawenxi 2014-03-08 02:35:57
表A:
id 车号

表B:
id 表A_id 车号 箱号 封号 客户


通过表A的id和表B的 表A_id实现关联,一条表A的数据可以有一个或者两个箱号,一个箱号可能有多个客户,

实现综合查询 组合成一个新表
id 车号 箱号 封号 箱号 封号 客户
1 辽a0011 箱号A 封号A 箱号B 封号B 客户a/客户b/客户c
...全文
1228 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2014-03-10
  • 打赏
  • 举报
回复
试试这个动态语句:
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			王五
*/  
LongRui888 2014-03-10
  • 打赏
  • 举报
回复
引用 7 楼 mawenxi 的回复:
[quote=引用 5 楼 lzw_0736 的回复:]

WITH a1 (id,车号) AS 
(
SELECT 1,'辽A1111' UNION ALL
SELECT 2,'辽B2222'
)
,a2 (id,表A_id,车号,箱号,封号,客户) AS
(
SELECT 1,1,'辽A1111','001','001','张三' UNION ALL
SELECT 2,1,'辽A1111','002','002','李四' UNION ALL
SELECT 3,2,'辽B2222','003','003','王五'
)
SELECT a.车号,b.箱号,b.封号
,CASE WHEN b.箱号=c.箱号 THEN '' ELSE c.箱号 END 箱号
,CASE WHEN b.封号=c.封号 THEN '' ELSE c.封号 END 封号
,d.客户
FROM a1 a
CROSS APPLY (SELECT TOP 1 箱号,封号 FROM a2 WHERE 表A_id=a.id ORDER BY 箱号) b
CROSS APPLY (SELECT TOP 1 箱号,封号 FROM a2 WHERE 表A_id=a.id ORDER BY 箱号 desc) c
CROSS APPLY (SELECT STUFF((SELECT '/'+客户 FROM a2 WHERE 表A_id=a.id FOR XML PATH('')),1,1,'') 客户) d
这是2005的写法吧 请问2000的话怎么写[/quote] 这个最好用动态语句实现,因为你的箱号,封号都是不确定的,个数有多又少的
發糞塗牆 2014-03-10
  • 打赏
  • 举报
回复
不用函数可能只有游标能做了,另外你的结果: 车号 箱号 封号 箱号 封号 客户 辽A1111 001 001 002 002 张三/李四 辽B2222 003 003 王五 有点不合理,李四本身没有箱号001的,但是这样展示的话你不能排除别人以为李四和张三同时拥有001、002,或者分不清谁拥有谁
mawenxi 2014-03-10
  • 打赏
  • 举报
回复
引用 5 楼 lzw_0736 的回复:

WITH a1 (id,车号) AS 
(
SELECT 1,'辽A1111' UNION ALL
SELECT 2,'辽B2222'
)
,a2 (id,表A_id,车号,箱号,封号,客户) AS
(
SELECT 1,1,'辽A1111','001','001','张三' UNION ALL
SELECT 2,1,'辽A1111','002','002','李四' UNION ALL
SELECT 3,2,'辽B2222','003','003','王五'
)
SELECT a.车号,b.箱号,b.封号
,CASE WHEN b.箱号=c.箱号 THEN '' ELSE c.箱号 END 箱号
,CASE WHEN b.封号=c.封号 THEN '' ELSE c.封号 END 封号
,d.客户
FROM a1 a
CROSS APPLY (SELECT TOP 1 箱号,封号 FROM a2 WHERE 表A_id=a.id ORDER BY 箱号) b
CROSS APPLY (SELECT TOP 1 箱号,封号 FROM a2 WHERE 表A_id=a.id ORDER BY 箱号 desc) c
CROSS APPLY (SELECT STUFF((SELECT '/'+客户 FROM a2 WHERE 表A_id=a.id FOR XML PATH('')),1,1,'') 客户) d
这是2005的写法吧 请问2000的话怎么写
mawenxi 2014-03-10
  • 打赏
  • 举报
回复
引用 4 楼 yupeigu 的回复:
[quote=引用 3 楼 mawenxi 的回复:] 等答案,周日晚上或周一回来结贴
用的是2000,还是2005呢[/quote] 用的2000
lzw_0736 2014-03-08
  • 打赏
  • 举报
回复

WITH a1 (id,车号) AS 
(
SELECT 1,'辽A1111' UNION ALL
SELECT 2,'辽B2222'
)
,a2 (id,表A_id,车号,箱号,封号,客户) AS
(
SELECT 1,1,'辽A1111','001','001','张三' UNION ALL
SELECT 2,1,'辽A1111','002','002','李四' UNION ALL
SELECT 3,2,'辽B2222','003','003','王五'
)
SELECT a.车号,b.箱号,b.封号
,CASE WHEN b.箱号=c.箱号 THEN '' ELSE c.箱号 END 箱号
,CASE WHEN b.封号=c.封号 THEN '' ELSE c.封号 END 封号
,d.客户
FROM a1 a
CROSS APPLY (SELECT TOP 1 箱号,封号 FROM a2 WHERE 表A_id=a.id ORDER BY 箱号) b
CROSS APPLY (SELECT TOP 1 箱号,封号 FROM a2 WHERE 表A_id=a.id ORDER BY 箱号 desc) c
CROSS APPLY (SELECT STUFF((SELECT '/'+客户 FROM a2 WHERE 表A_id=a.id FOR XML PATH('')),1,1,'') 客户) d
LongRui888 2014-03-08
  • 打赏
  • 举报
回复
引用 3 楼 mawenxi 的回复:
等答案,周日晚上或周一回来结贴
用的是2000,还是2005呢
mawenxi 2014-03-08
  • 打赏
  • 举报
回复
等答案,周日晚上或周一回来结贴
mawenxi 2014-03-08
  • 打赏
  • 举报
回复
表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 王五
唐诗三百首 2014-03-08
  • 打赏
  • 举报
回复
LZ最好能提供表A,表B的测试数据,以及希望得到的结果,才好帮你写喔.

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧