sql- sum if() 用法举例

发布时间:2024年01月17日

题目:

? ??从订单明细表(order_detail)中查询出所有购买过商品1和商品2,但是没有购买过商品3的用户

订单表 order_info

? ? ? ??

order_id (订单id)user_id (用户id)create_date (下单日期)total_amount (订单金额)
11012021-09-3029000.00
101032020-10-0228000.00

订单明细表 order_detail

? ? ? ?

order_detail_id(订单明细id)order_id(订单id)sku_id(商品id)create_date(下单日期)price(商品单价)sku_num(商品件数)
1112021-09-302000.002
2132021-09-305000.005
221042020-10-026000.001
231052020-10-02500.0024
241062020-10-022000.005

计算逻辑

1.使用差集

1. 将订单表与订单明细表进行join,获取所有用户,商品信息
? ? ?select

? ? ? ? ? ? od.order_id,

? ? ? ? ? ? sku_id,

? ? ? ? ? ? user_id

? ? ?from ?order_detail od

? ? ?join??order_info oi??

? ? ?on oi.order_id = od.order_id? ? ? ? ? ? ? ?t1

? ? ?

2.按照用户,商品,分组,统计用户购买单种商品的数量
? ? select?

? ? ? ? ?user_id,

? ? ? ? ? sku_id,

? ? ? ? ? count(*) ct

? ? from t1

? ? group by user_id,sku_id? ? ? ? ? ? ? ? ? ? t2
3.根据用户购买每种商品的数量,筛选购买1,2但是没有购买3的商品。
? ? select

? ? ? ? ? ? user_id

? ? ?from t2

? ? where sku_id in (1,2) and user_id not in?

? ?(select

? ? ? ? ? ? user_id

? ? from t2

? ? where sku_id = 3)

? ?group by user_id

? ??
4.拼接最终SQL

? ??

with tmp1 as (
  select
      sku_id,
      user_id,
      count(*) ct
  from 
  (
  select
      od.order_id,
      sku_id,
      user_id
  from 
      order_detail od
  join 
      order_info oi
  on 
      od.order_id = oi.order_id
  )t1
  group by sku_id,user_id
)

select
	user_id
from 
   tmp1
where sku_id in (1,2)
and user_id not in
(select
	user_id
from tmp1
where sku_id = 3)
group by user_id

2.使用sum if

??1. 将订单表与订单明细表进行join,获取所有用户,商品信息

? ? ??

order_detail od
      join order_info oi on od.order_id = oi.order_id
? 2.按照用户,商品,分组,统计用户-商品的信息

? ? ?

    SELECT
      oi.user_id,
      od.sku_id
    from t1
    group by
      oi.user_id,
      od.sku_id
? 3.根据用户分组,使用sum..if.. 统计购买1,2但是没有购买3的用户。

? ? 不难看出,使用sum if 可以统计购买1,2的用户。若不符合过滤条件,将不会展示用户信息

? ? 同时,having后面直接添加聚合函数进行聚合,简化了在select语句写聚合函数的过程。

SELECT
  user_id
from t3
group by
  user_id
having
  sum(if (sku_id = 3, -3, if (sku_id in (1, 2), 1, 0))) = 2
? 4.最终SQL
SELECT
  user_id
from
  (
    SELECT
      oi.user_id,
      od.sku_id
    from
      order_detail od
      join order_info oi on od.order_id = oi.order_id
    group by
      oi.user_id,
      od.sku_id
  ) t
group by
  user_id
having
  sum(if (sku_id = 3, -3, if (sku_id in (1, 2), 1, 0))) = 2

------ 第二种是某位大佬写的,更推荐第二种写法,不禁肃然起敬。

文章来源:https://blog.csdn.net/qq_44835418/article/details/135638525
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。