调试SQL数据,发现数据记录集重复问题,所以,计算出的数据结果倍数问题。通过调试SQL,发现是物料的分类产生重复;之所以产生重复,物料的分类标准不一样,与实际的业务有关。程序中一直用类别来区分类别,而这张次实际业务不需要与类别有关,所以,没有对应的过滤条件,所有的类别全部选出来了。然后,把下面的红色字段注释掉,结果正确。这个问题与之前的union all 或 distinct 有点类似。所以,谨慎而正确的使用,一定要认真的分析业务,只有正确的理解实际的业务需求,才能写出正确的SQL语句。甚至左连接,右连接或内连接,都是与业务有关的。
/*dialect*/
select nvl(sum(nvl(tcta.fcznum, 0)), 0) superadditionCount,
nvl(sum(nvl(tcta.fczmoney, 0)), 0) superadditionMoney,
nvl(sum(nvl(tcta.fczresetnum, 0)), 0) superadditionReenabledCount,
nvl(sum(nvl(tcta.fczresetmoney, 0)), 0) superadditionReenabledMoney,
nvl(sum(nvl(tcta.fczdiffmoney, 0)), 0) superadditionDifferenceCount
from
t_cus_thkentrys2 tcta
inner join t_cus_thk tct on tcta.fparentid = tct.fid
left join ( /*dialect*/
select distinct
tbc.fid id,
tbcg.fid bid,
tbcg.fnumber businessType,
tbcg.fname_l2 businessName,
tbcs.fnumber classificationStandardCoding,
tbcs.fname_l2 classificationStandardName,
tbc.fnumber clientCode,
tbc.fname_l2 clientName,
tbc.faddress address,
tbc.fname_l2 unitName
from
t_bd_csspgroup tbcg
inner join t_bd_csspgroupstandard tbcs on tbcg.fcsspgroupstandardid = tbcs.fid
inner join t_bd_customer tbc on tbc.fbrowsegroupid = tbcg.fid) customer on customer.id = tct.fbackunitid
left join ( /*dialect*/
select distinct
material.fid id, -- 物料id.
material.fnumber materialCode/*, -- 物料编码.
nvl(material.flength, 0) deposite, -- 押金.
nvl(material.fwidth, 0) storeValue, -- 储值.
nvl(material.flength, 0) actualDeposite, -- 实际押金 = 押金.
mgroup.fnumber cardCategory -- 卡类别.*/
from
t_bd_materialgroupdetial mgdetail
inner join t_bd_materialgroup mgroup on mgroup.fid = mgdetail.fmaterialgroupid
inner join t_bd_materialgroupstandard mgstand on mgstand.fid = mgdetail.fmaterialgroupstandardid
inner join t_bd_material material on material.fid = mgdetail.fmaterialid) material on material.id = tcta.fczproducidid
where
customer.clientCode = '101001'
and material.materialCode like '3%'
and tct.fbillstates = 25
and to_char(tct.fbizdate, 'yyyy-MM-dd') >= '2009-01-01'
and to_char(tct.fbizdate, 'yyyy-MM-dd') <= '2009-01-31'