这道题目要求我们查询客户Tom在2023年每月的消费总金额,并按月份升序显示。下面是这个SQL查询的思路和实现步骤。

1. 确定总体问题

我们需要计算客户Tom在2023年每月的消费总金额。消费的定义是交易类型为1。

2. 分析关键问题

  • 获取交易的客户名称:我们需要将tradecustomer表连接起来,以便获取每个交易的客户名称。
  • 过滤数据:只选择交易类型为消费1的记录,并且客户名称为Tom,交易时间在2023年。
  • 按月汇总:按月份汇总消费金额。
  • 格式化输出:将结果按月份升序显示。

3. 解决每个关键问题的代码及讲解

步骤1:获取交易的客户名称

我们使用JOINtradecustomer表连接起来:

FROM
    trade t
JOIN
    customer c ON t.t_cus = c.c_id
  • ON t.t_cus = c.c_id:通过客户ID进行连接。
步骤2:过滤数据

我们使用WHERE子句来过滤出符合条件的记录:

WHERE
    t.t_type = 1
    AND c.c_name = 'TOM'
    AND YEAR(t.t_time) = 2023
  • t.t_type = 1:选择交易类型为消费的记录。
  • c.c_name = 'TOM':选择客户名称为Tom的记录。
  • YEAR(t.t_time) = 2023YEAR提取出t_time中的年份,选择交易时间在2023年的记录。
步骤3:按月汇总

我们使用GROUP BYSUM函数按月份汇总消费金额:

SELECT
    DATE_FORMAT(t.t_time, '%Y-%m') AS time,
    ROUND(SUM(t.t_amount),1) AS total
GROUP BY
    time
  • DATE_FORMAT(t.t_time, '%Y-%m') AS time:将交易时间格式化为年月。
  • SUM(t.t_amount):计算每月的消费总金额。
  • ROUND(...,1):将结果四舍五入保留一位小数。
步骤4:格式化输出

我们使用ORDER BY按月份升序显示结果:

ORDER BY
    time

完整代码

SELECT
    DATE_FORMAT(t.t_time, '%Y-%m') AS time,
    ROUND(SUM(t.t_amount),1) AS total
FROM
    trade t
JOIN
    customer c ON t.t_cus = c.c_id
WHERE
    t.t_type = 1
    AND c.c_name = 'TOM'
    AND YEAR(t.t_time) = 2023
GROUP BY
    time
ORDER BY
    time