现有这样一个需求:
在一个电商订单管理平台中,我想查看所有已付款订单中,哪些订单是有部分退款的。
一开始思路是这样是没错的:
在订单详情表里的num数量和大于退款详情表里的num数量之和即可,也就是SUM(nums)>SUM(num)。
为了达成这样的目的,我一开始在MySql里直接这样运行了,代码如下:
SELECT soo.order_bn, sooi.order_id,sooi.nums,sori.numfrom sdb_ome_orders soo left join sdb_ome_order_items sooi on sooi.order_id = soo.order_id left join sdb_ome_reship sor on sor.order_id = soo.order_id left join sdb_ome_reship_items sori on sori.reship_id = sor.reship_id WHERE soo.shop_id = '52759ae5ccd9d10b9ad763cb78ec2c77'and SUM(sooi.nums) > SUM(sori.num);
但是运行的结果发生了如下报错:
SQL Error [1111] [HY000]: Invalid use of group function。
单独注释掉最后一条,运行其他的是可以出来结果的。
所以where语句后面是不能使用sum聚合函数的,怎么办呢?
你可以单独用订单表连接订单明细表,把查询出来的结果定义为表A,将A里的nums求和设为a,
然后用订单表连接退款明细表,将查询出来的结果定义为表B,将B里的num求和设为b,然后再where语句中进行筛选对比即可。
完整代码如下:
SELECT * FROM (SELECT order_bn,sooi.bn,sum(sooi.nums) as bFROM sdb_ome_orders sooleft join sdb_ome_order_items sooi on soo.order_id = sooi.order_id WHERE soo.shop_id = '52759ae5ccd9d10b9ad763cb78ec2c77'group by order_bn ,sooi.bn) AS sooileft join (select order_bn,sori.bn,sum(sori.num) as a from sdb_ome_orders sooleft join sdb_ome_reship sor on sor.order_id = soo.order_id left join sdb_ome_reship_items sori on sori.reship_id = sor.reship_id WHERE soo.shop_id = '52759ae5ccd9d10b9ad763cb78ec2c77'group by order_bn ,sori.bn) as sor on sooi.order_bn=sor.order_bn where b>aand sooi.bn=sor.bnlimit 100;
运行结果如下(查询时间稍微长一点):