这道题目要求我们查询客户Tom在2023年每月的消费总金额,并按月份升序显示。下面是这个SQL查询的思路和实现步骤。
1. 确定总体问题
我们需要计算客户Tom在2023年每月的消费总金额。消费的定义是交易类型为1。
2. 分析关键问题
- 获取交易的客户名称:我们需要将
trade
和customer
表连接起来,以便获取每个交易的客户名称。 - 过滤数据:只选择交易类型为消费1的记录,并且客户名称为Tom,交易时间在2023年。
- 按月汇总:按月份汇总消费金额。
- 格式化输出:将结果按月份升序显示。
3. 解决每个关键问题的代码及讲解
步骤1:获取交易的客户名称
我们使用JOIN
将trade
和customer
表连接起来:
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) = 2023
:YEAR
提取出t_time中的年份,选择交易时间在2023年的记录。
步骤3:按月汇总
我们使用GROUP BY
和SUM
函数按月份汇总消费金额:
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