MySql语句Having语法使用

有这么一个需求:

在订单库里,需要拉取满足相应的时间段,指定的货号id,购买人的地址,电话号码等信息,但有个前提条件,客户购买的这个id,它的实付总金额必须是大于111元的。

接下来我们就分析一下如何达成这个需求:

客户单次购买会生成一个订单号,然后有商品列表。此外货号的一个id内会含有不同尺寸和颜色,因此mode code也是不同的。也就是一个客户可能会购买多个物件,多种商品。

这种情况下,需要用到sum()聚合函数,然后按照订单号分组即可。

好了,那么我们下面写好了初步的SQL如下:

select
soo.order_bn as '订单号',
FROM_UNIXTIME(soo.createtime) as '创建时间',
soo.ship_name as '顾客姓名',
sooi.shop_goods_id,
SUM(sooi.nums*sooi.divide_order_fee) as '付款金额',
CONCAT(soo.ship_area,soo.ship_addr) as '顾客地址',
soo.ship_mobile as '顾客电话'
from sdb_ome_orders soo
inner join sdb_ome_order_items sooi on sooi.order_id = soo.order_id
where FROM_UNIXTIME(soo.createtime)>='2021-11-01 00:00:00'
and FROM_UNIXTIME(soo.createtime) <= '2021-11-01 00:45:00'
and sooi.shop_goods_id = '610278455498'
and SUM(sooi.nums*sooi.divide_order_fee)>111
group by soo.order_bn;

经过运行后,我们发现了如下报错:

[Err] 1111 - Invalid use of group function。

经过反复查阅相关资料发现,这里的where语句里是不能使用聚合函数的,得使用一个having函数来替代。

整理后代码如下:

select
soo.order_bn as '订单号',
FROM_UNIXTIME(soo.createtime) as '创建时间',
soo.ship_name as '顾客姓名',
sooi.shop_goods_id,
SUM(sooi.nums*sooi.divide_order_fee) as '付款金额',
CONCAT(soo.ship_area,soo.ship_addr) as '顾客地址',
soo.ship_mobile as '顾客电话'
from sdb_ome_orders soo
inner join sdb_ome_order_items sooi on sooi.order_id = soo.order_id
where FROM_UNIXTIME(soo.createtime)>='2021-11-01 00:00:00'
and FROM_UNIXTIME(soo.createtime) <= '2021-11-01 00:45:00'
and sooi.shop_goods_id = '610278455498'
group by soo.order_bn
having SUM(sooi.nums*sooi.divide_order_fee)>111;

运行结束,运行log为:

受影响的行: 0
时间: 14.266s。

运行结果出来了,无报错。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆萌的小辣条

您的打赏将是对我最大的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值