有这么一个需求:
在订单库里,需要拉取满足相应的时间段,指定的货号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。
运行结果出来了,无报错。