MySQL-group by、join、where连用出现的查询结果不一致的问题

文章讨论了在业务处理中如何正确运用SQL的leftjoin和where,以避免缺失数据并提高查询效率。
摘要由CSDN通过智能技术生成

需求背景

今天在处理实际业务时,有一个表单其需求是展现如下图数据
在这里插入图片描述
其主要数据来源于A表,A表包含病种、科室、单例病种实际治疗费用,需要通过病种号关联B表中单例病种标准治疗费用。

实际编程

先left join,再where

运行结果:588条

  select 
    病种,
    科室,
    病例数,
    次均费用,
    B.PJZYFY 标准费用,
    (次均费用-B.PJZYFY) 次均与标准费用的差,
    费用高值,
    费用低值
		from (
       SELECT
            A.dise_group_code 病种编码,
						A.dscg_dept_name 科室,
						A.dise_group_name 病种名称,
            COUNT(*) 病例数,
            ROUND(SUM(A.ipt_sumfee) / COUNT(*),2) 次均费用,
            0 标准费用,
            0  次均与标准费用的差,
            MAX(A.ipt_sumfee) 费用高值,
            MIN(A.ipt_sumfee) 费用低值
        FROM
            t_ybfzxxb A
        WHERE
            A.CASES_ZTBS IN ('偏高', '偏低', '正常')
						group by A.dise_group_code,A.dscg_dept_name,A.dise_group_name
						) T

			left join t_dip_qzmx_tbl as B on T.病种编码 = B.FZBM
	    where	B.CBLB = '310'

先where,再left join

运行结果:710条

  select 
    病种,
    科室,
    病例数,
    次均费用,
    B.PJZYFY 标准费用,
    (次均费用-B.PJZYFY) 次均与标准费用的差,
    费用高值,
    费用低值
		from (
       SELECT
            A.dise_group_code 病种编码,
						A.dscg_dept_name 科室,
						A.dise_group_name 病种名称,
            COUNT(*) 病例数,
            ROUND(SUM(A.ipt_sumfee) / COUNT(*),2) 次均费用,
            0 标准费用,
            0  次均与标准费用的差,
            MAX(A.ipt_sumfee) 费用高值,
            MIN(A.ipt_sumfee) 费用低值
        FROM
            t_ybfzxxb A
        WHERE
            A.CASES_ZTBS IN ('偏高', '偏低', '正常')
						group by A.dise_group_code,A.dscg_dept_name,A.dise_group_name
						) T

			left join
			 (select * from t_dip_qzmx_tbl where	CBLB = '310') as B on T.病种编码 = B.FZBM
	    

总结

经核对数据发现先进行join操作的,缺失的数据是,B表无法关联对应病种号的数据,无论是使用left或是right其返回结果值都是等同于inner join的返回值。所以建议group by、join、where查询条件同时使用的时候,对返回值是left抑或right时,先对表进行where操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值