首页 > 代码库 > 同一主表,明细不同数据进行合并

同一主表,明细不同数据进行合并

对明细中的同一主键ID相关数据进行合并

1.主表的【项目】+明细表的【附加项目】 

2.明细表的金额

数据源

if object_id(tempdb..#主表) is not null drop table tempdb..#主表if object_id(tempdb..#细表) is not null drop table tempdb..#细表select 1 主键, a 项目, 3000 金额, 3210 小计金额  into #主表 union allselect 2, a, 4500, 5000 union allselect 3, a, 600, 680 union allselect 4, a, 1400, 1600select 1 主表主键, wms 附加项目, 10 单价, 140 金额 into #细表 union allselect 1, oms, 5, 70 union all          select 2, crm, 20, 400 union allselect 2, 综合, 5, 100 union allselect 3, crm, 20, 80 union allselect 4, crm, 20, 200

 

方法1 使用case when 表达式 then 赋值 esle end 

if object_id(tempdb..#目标细表) is not null drop table tempdb..#目标细表select 主表主键,cast(附加项目 as varchar(300)) 附加项目,单价,金额 into #目标细表 from #细表declare @主表主键 varchar(max)=‘‘,@附加项目 varchar(max)=‘‘update a  set @附加项目=case when @主表主键=主表主键 then isnull(@附加项目,‘‘)+isnull(附加项目,‘‘)                    else isnull(附加项目,‘‘)                    end,@主表主键=a.主表主键,附加项目=isnull(@附加项目,‘‘) ,a.金额=a.金额from #目标细表 a;with itas(select 主表主键,max(附加项目) 项目,sum(金额) 附加金额 from #目标细表 a group by 主表主键 )select a.项目+b.项目 项目,金额,小计金额,附加金额 from #主表 a join it  b on a.主键=b.主表主键 

执行结果

 

方法2 使用行转列的方法 动态sql

if object_id(tempdb..#目标细表‘) is not null drop table tempdb..#目标细表
select
主表主键,附加项目,单价,金额, rn = row_number() over(partition by 主表主键 order by 主表主键)into #目标明细from #细表 declare @sql varchar(max)=‘‘,@sql2 varchar(max)=‘‘,@fiede varchar(max)=‘‘select @fiede =@fiede+附加项目+cast(rn as varchar(10))++ from #目标明细group by rnset @fiede=left(@fiede,len(@fiede)-1)select @sql=select 主表主键select @sql=@sql+, isnull(max(case rn when ‘‘‘+cast(rn as varchar(10))+‘‘‘ then 附加项目 end ),‘‘‘‘) 附加项目+cast(rn as varchar(10))+, isnull(max(case rn when ‘‘‘+cast(rn as varchar(10))+‘‘‘ then 金额 end ),0) 金额+cast(rn as varchar(10))+from #目标明细group by rnselect @sql=@sql+ into #统计结果 from #目标明细 group by 主表主键print @sqlset @sql2 = select a.项目++@fiede+ 项目,a.金额,a.小计金额,a.小计金额-a.金额 附加金额 from #主表 a join #统计结果 b on a.主键=b.主表主键 set @sql=@sql+@sql2exec(@sql)

 

 

执行结果

同一主表,明细不同数据进行合并