这是一个很奇怪的问题,,一个我都不知道该怎么起博文标题的问题
具体现象就是,有一个查询业务,存在一个会员基础表含卡号,手机号,开卡日期,卡余额等等。
因为之前对会员数据规划和后续系统不同的原因,需要将基础表中的数据以手机号为主,相同手机号卡余额等积分金额类数据求和,其他信息取开卡日期最早的数据进行填充。
这个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
就是过滤的手机号相同且开卡日期为最小值的才可以匹配过来,加班到凌晨五点也没想清楚,后来脑子也混沌了,中午醒了才算出差额,将重复的数据计算后发现差额对上了,数据中存在手机号相同且在同一时刻开的卡。