题解 | #获取指定客户每月的消费额#

获取指定客户每月的消费额

https://www.nowcoder.com/practice/ed04f148b63e469e8f62e051d06a46f5?tpId=375&tags=&title=&difficulty=0&judgeStatus=0&rp=0&sourceUrl=%2Fexam%2Foj%3FquestionJobId%3D10%26subTabName%3Donline_coding_page

这道题目要求我们查询客户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
全部评论
请问为什么最后group by和order by必须用time 我用t_time的答案就不正确呢?
点赞 回复 分享
发布于 08-18 23:09 北京
不是说聚合函数里面不能用where吗
点赞 回复 分享
发布于 08-07 18:01 四川

相关推荐

不愿透露姓名的神秘牛友
11-21 11:29
已编辑
斯卡蒂味的鱼汤:知道你不会来数马,就不捞你😂最近数马疯狂扩招,招聘要求挺低的,你能力肯定够,应该就是因为太强了,知道你不会来才不捞你
投递腾讯云智研发等公司7个岗位
点赞 评论 收藏
分享
LZStarV:冲就好了,就算真的是字节也冲,面评脏了大不了等三四个月就淡了,而且等到那个时候实力进步了选择还多,何必拘泥于字节
点赞 评论 收藏
分享
评论
8
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务