mysql根据类型和数据正负进行分组

本文介绍了在MySQL中如何根据操作类型及数值的正负进行数据分组,以解决因分组导致的数据丢失问题。示例代码展示了在mapper中的SQL改写,通过排除0值来确保正确结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql根据类型和数据正负进行分组

今天遇到了一个问题:需要根据数据的操作类型和数据是否大于0进行分组。其实最主要的原因还是因为代码设计最初的时候考虑不够全面,现在遇到了这个问题,再去改代码的话风险非常大。
下面贴出部分代码:

    private void fillResponse(ProductErp e, ProductResponse response) {
        switch (e.getBizType()) {
        	//入库
        	case 1:
                response.setEnterQty(e.getQty());
                response.setEnterAmt(e.getAmt());
                break;
        	//销售
            case 2:
                //正常销售
                if (e.getQty() >= 0) {
                    response.setSalesQty(e.getQty());
                    response.setSalesAmt(e.getAmt());
                } else {
                    //销售退货
                    response.setReturnQty(e.getQty());
                    response.setReturnAmt(e.getAmt());
                }
                break;
            default:
                break;
        }
   }

在数据查询的时候,我需要根据操作类型和数据的正负进行分组,要不然销售退货或者正常销售就会没数据(因为分组的时候会将数据相加)。
正常写的mapper中的sql:

SELECT
        biz_type,
        ifnull( sum( qty ), 0 ) qty,
        ifnull( sum( qty * prd_price ), 0 ) amt
        FROM
        t_sale
        WHERE
        biz_time BETWEEN #{request.startTime} AND #{request.endTime}
        GROUP BY
        biz_type

这样输出的结果只有两行:
不正确的结果
查询了资料,找到了下面的解决方法:

SELECT
        biz_type,
        ifnull( sum( qty ), 0 ) qty,
        ifnull( sum( qty * prd_price ), 0 ) amt
        FROM
        t_sale
        WHERE
        biz_time BETWEEN #{request.startTime} AND #{request.endTime}
        and qty !=0
        GROUP BY
        biz_type,
        sign(qty)

这样就可以解决了(注意,要把0的排除掉,否则的话会多输出一行0的)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值