题解 | 获取指定客户每月的消费额
获取指定客户每月的消费额
https://www.nowcoder.com/practice/ed04f148b63e469e8f62e051d06a46f5
我是肺物
我原来的题解:
select
date_format(t.t_time, '%Y-%m') time,
round(sum(t.t_amount), 1) 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
t.t_time, c.c_id
order by
time asc;
答案题解:
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
啥区别:
GROUP BY 子句
- 1 GROUP BY t.t_time, c.c_id: 这条语句根据交易的精确时间戳 (t.t_time) 和客户 ID (c.c_id) 进行分组。
- 影响: 如果同一个客户在同一个月份内有多次交易,但这些交易发生在不同的日期,甚至不同的时、分、秒,那么每一个独特的 t_time 都会形成一个独立的分组。这意味着可能会在结果中看到 'Tom' 在同一个月份有多行数据,每一行显示的是某个特定 t_time 下的交易总额。这可能不是想要的结果,如果想按月汇总的话。
- 2 GROUP BY time: 这条语句根据 SELECT 语句中格式化后的月份字符串 (%Y-%m),也就是 time 别名进行分组。
- 影响: 这是获取每月总额的正确方式。所有 'Tom' 在特定月份(例如 '2023-01')的交易都将被聚合在一起,它们的 t_amount 会被求和,形成该月份的唯一 total。
