注册 登录
编程论坛 SQL Server论坛

单位ERP软件中的语句求助(合并重复记录,并累加其中一个字段的值)

ictest 发布于 2016-10-14 13:42, 2493 次点击
单位ERP软件中,要对一个查询表单做如下操作,对TD.ItmTBName列进行合并重复记录,如果TD.ItmTBName列数据相同的话就将相同的多条记录合并成一条记录,且将TD.Qty列数据相加,

原语句为:
select TM.DocNum,TM.DocDate,TM.DocEntry,TM.ObjType,TM.CrdID,TM.CrdName,TD.LineNum,TD.ItmTBName,TD.VndID,TD.fzxs,TD.ItmID,TD.ItmName,TD.ItmTAName,TD.ksph,TD.zzph,TD.khksp,TD.ShipDate,TD.lls,
TD.Qty,TD.lps,TD.hgsA,TD.hgsB,TD.hgsC,TD.hgsD,TD.hgsE,
TD.blpsj,TD.wc,TD.kdl,TD.ds,Factor2,
TD.BIN0,TD.BIN1,TD.BIN2,TD.BIN3,TD.BIN4,TD.BIN5,
TD.BIN6,TD.BIN7,TD.BIN8,TD.BIN9,
TD.BIN10,TD.BIN11,TD.BIN12,TD.BIN13,TD.BIN14,
TD.BIN15,TD.BIN16,TD.BIN17,TD.BIN18,
TD.BIN19,TD.BIN20,TD.BIN21,TD.BIN22,TD.BIN23,TD.BIN24,
TD.BIN25,TD.BIN26,TD.BIN27,TM.DocDate,TD.dd,
(Case When TD.ItmName is not null Then '完成' END) cfc,
(isnull(TD.hgsA,0)+isnull(TD.hgsB,0)+isnull(TD.hgsC,0)+isnull(TD.hgsD,0)+isnull(TD.hgsE,0)) cslp,
(isnull(TD.hgsA,0)+isnull(TD.hgsB,0)+isnull(TD.hgsC,0)+isnull(TD.hgsD,0)+isnull(TD.hgsE,0)) passbin,
from WHOidA TD
left join WHOid TM on TM.DocEntry=TD.DocEntry
where TM.DocKind=1 and TM.DocDate>=@DocDateFr and TM.DocDate<=@DocDateTo
AND TD.ItmName like 'BP%'

如果我把TD.Qty写成 sum(TD.Qty) Qty,并在最尾增加语句 group by TD.ItmTBName 的话,文件会报错,显示
错误,请帮看看怎么回事。
3 回复
#2
mywisdom882016-10-14 16:37
合并数据的话,其他字段理论上是相同的,如果其他字段还有不相同的,那合计出来的结果,就失去了本来的意义。如下:
create table #tmp(ObjType int,CrdID varchar(19),CrdName varchar(10),ItmTBName varchar(10),Qty numeric(10,2))
如果你合并的时候,同时显示 ObjType,CrdID,CrdName, 那么,这3个字段的内容基本上是相同的,才能合并,才有意义。
下面,是 ObjType,CrdID,CrdName,ItmTBName 都相同的数据合并,可以全放到分组去,也可以不放到分组去,如果这些字段是从别的表来的,用左连接比较方便
--用左连接方法:
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp
go
create table #tmp(ObjType int,CrdID varchar(19),CrdName varchar(10),ItmTBName varchar(10),Qty numeric(10,2))
insert into #tmp
select 1,'001','a001','b001',10.10 union all
select 2,'002','a002','b002',20.20 union all
select 1,'001','a001','b001',50.10 union all
select 3,'003','a003','b003',30.30 union all
select 4,'004','a004','b004',40.40 union all
select 2,'002','a002','b002',20.10

select * from #tmp

select distinct tm.ObjType,tm.CrdID,tm.CrdName,tm.ItmTBName,ts.Qty from #tmp tm
left join
(select ItmTBName,isnull(sum(Qty),0) as Qty from #tmp group by ItmTBName)ts on tm.ItmTBName=ts.ItmTBName
#3
mywisdom882016-10-14 16:43
--如果 ObjType,CrdID,CrdName,ItmTBName 等等需要显示的字段还有不相同的,还要区分的,如 ObjType 还有不相同的
select distinct tm.ObjType,tm.CrdID,tm.CrdName,tm.ItmTBName,ts.Qty from #tmp tm
 left join
 (select ObjType,ItmTBName,isnull(sum(Qty),0) as Qty from #tmp group by ItmTBName,ObjType)ts on tm.ItmTBName=ts.ItmTBName AND tm.ObjType=ts.ObjType
#4
mywisdom882016-10-14 16:57
--还可以
--你要显示多少个,你就要by 多少个。要不就会报错误。
--要显示的字段,有2个条件,1就是要用聚合函数如,MIN(字段名),MAX(字段名),AVG(字段名),SUM(字段名)等等函数,2要不就只能放到分组条件去 group by 字段1,字段2,字段3,字段N
select tm.ObjType,tm.CrdID,tm.CrdName,tm.ItmTBName,sum(tm.Qty) Qty from #tmp tm
group by tm.ObjType,tm.CrdID,tm.CrdName,tm.ItmTBName

1