You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于订单数与用户信息的客户奖金资格分类查询需求

解决方案

表结构与数据

Orders表

Customer_IDORDER_IDSTATUS
A11completed
A12completed
B13completed
B14completed
B15completed
C16completed
B17cancelled
A18cancelled

Customers表

Customer_IDCustomer_statusjoin_date
A152022-02-09
b152022-02-10
c102022-02-10

原SQL问题分析

你写的SQL存在几个关键问题:

  • 关联后过滤丢失客户:LEFT JOIN后在WHERE子句中过滤T2.Customer_status=15等条件,会将LEFT JOIN转为INNER JOIN,无法保留所有客户。
  • 状态值匹配错误:Orders表的STATUS是字符串类型(如completed),你用数字6判断,完全不匹配。
  • 订单统计范围错误:直接count(T1.ORDER_ID)会统计所有订单(包括取消的),但需求只统计已完成的订单。
  • 缺少分类逻辑:没有实现奖金合格/不合格的判断逻辑,仅做了订单数统计。

正确SQL实现

SELECT
    c.Customer_ID,
    CASE
        WHEN c.Customer_status = 15
             AND c.join_date = '2022-02-10'
             AND COALESCE(COUNT(CASE WHEN o.STATUS = 'completed' THEN o.ORDER_ID END), 0) > 1
        THEN '奖金合格'
        ELSE '奖金不合格'
    END AS bonus_status
FROM Customers c
LEFT JOIN Orders o ON UPPER(c.Customer_ID) = o.Customer_ID
GROUP BY c.Customer_ID, c.Customer_status, c.join_date
ORDER BY c.Customer_ID;

关键说明

  1. 以客户表为主关联订单:用Customers做主表做LEFT JOIN,确保所有客户都能出现在结果中,不会遗漏。
  2. 统一ID大小写:原表中Customers的ID有小写(b、c),Orders的ID是大写(B、C),用UPPER()统一后才能正确关联。
  3. 精准统计已完成订单:通过CASE WHEN o.STATUS = 'completed' THEN o.ORDER_ID END筛选已完成订单,再用COUNT统计数量;COALESCE处理无订单的极端情况,确保统计值不为NULL。
  4. CASE语句实现分类:严格按照需求的三个条件判断,满足则标记为「奖金合格」,其余全部标记为「奖金不合格」。

执行结果

Customer_IDbonus_status
A奖金不合格
b奖金合格
c奖金不合格

内容的提问来源于stack exchange,提问作者Nancy Elhossiny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:05:18