sql使用分组查询求和后在连接原表匹配出的数据变多了

文章讲述了作者在处理一个查询业务时遇到的问题,需要对基础表按手机号分组并求和卡余额等信息,同时保证其他数据的准确性。通过分析发现,左连接时由于可能存在多个同一手机号对应的数据,导致原始SQL计算错误。通过调整连接条件,过滤掉重复数据,最终解决了问题。
摘要由CSDN通过智能技术生成

这是一个很奇怪的问题,,一个我都不知道该怎么起博文标题的问题
具体现象就是,有一个查询业务,存在一个会员基础表含卡号,手机号,开卡日期,卡余额等等。
因为之前对会员数据规划和后续系统不同的原因,需要将基础表中的数据以手机号为主,相同手机号卡余额等积分金额类数据求和,其他信息取开卡日期最早的数据进行填充。

这个sql不难,基础表分组求和后,在用手机号和开卡日期等于最小日期连基础表将其他信息进行填充就可以了
sql如下


SELECT
	t2.id,
	t2.hykh,
	t2.klx,
	t2.kdj,
	t2.kzt,
	t2.hyxm,
	t1.sjh,
	t2.dz,
	t2.dwmc,
	t2.rhdp,
	t2.kkrq AS kkrq,
	t2.yj,
	t1.xjkz,
	t1.zskz,
	t1.kye AS kye,
	t2.djxjkz,
	t2.djzskz,
	t2.djkz,
	t1.jfye,
	t1.ljczze,
	t1.ljkxfze,
	t1.xfcs,
	t1.czcs,
	t2.ljhqjf,
	t2.ljxfjf,
	t2.kpjxf,
	t2.zhjysj,
	t2.yxq 
FROM
	(
	SELECT
		sjh,
		SUM( kye ) AS kye,--卡余额等金额积分类需要求和的信息
		SUM( xjkz ) AS xjkz,
		SUM( zskz ) AS zskz,
		SUM( jfye ) AS jfye,
		SUM( ljczze ) AS ljczze,
		SUM( ljkxfze ) AS ljkxfze,
		SUM( xfcs ) AS xfcs,
		SUM( czcs ) AS czcs,
		MIN( kkrq ) AS min_kkrq 
	FROM
		hy 
	GROUP BY
		sjh 
	) t1
	JOIN hy t2 ON t1.sjh = t2.sjh 
	AND t1.min_kkrq = t2.kkrq
	

这个sql没啥毛病,但是查询后校验一下核对金额发现最后的卡余额和基础表直接求和对不上。
思考良久仍然没有找到问题。后来把sql逐层拆解了一下,发现问题出在最后的连接t2匹配其他信息处了。

首先需要了解一下这个连表

请添加图片描述

不难看出,左连接时当负责匹配的表存在多条与主表存在连接关系的数据时,就不一样了,这个知识点之前我不大了解,之前习惯了谁最全谁做主表的我被当头一棒。

不难看出,这种情况再去把原来分组求和后的数据和基础表匹配就会算多了。

但这种情况下可以通过靠连表的条件进行过滤,这里我最上面的sql中的
hy t2 ON t1.sjh = t2.sjh
AND t1.min_kkrq = t2.kkrq
就是过滤的手机号相同且开卡日期为最小值的才可以匹配过来,加班到凌晨五点也没想清楚,后来脑子也混沌了,中午醒了才算出差额,将重复的数据计算后发现差额对上了,数据中存在手机号相同且在同一时刻开的卡。
请添加图片描述

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值