订阅更新

每月交易一:按月和国家统计全部与已批准

SQL 实战 123 题 · 第 76 题 中等 约 2 分钟读完

LeetCode 1193 · 多指标条件聚合、日期格式化分组

本文目录
  1. 面试怎么回答
  2. 题意
  3. 表结构
  4. 思路
  5. 参考解法
  6. 易错点

面试怎么回答

按 DATE_FORMAT(trans_date, '%Y-%m') 和 country 分组,COUNT(*) 是总笔数,SUM(state = 'approved') 是批准笔数,SUM(amount) 和 SUM(IF(state = 'approved', amount, 0)) 是两个金额。我会提醒条件计数时 COUNT(IF(..., 1, 0)) 会把 0 也计进去,这是常见错误。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

题意

交易表记录每笔交易的国家、状态(approved / declined)、金额和日期。按「月份 + 国家」统计:交易笔数、已批准笔数、交易总额、已批准总额。

表结构

  • Transactions:id(主键)、country、state、amount、trans_date

思路

一次分组算四个指标:总数用 COUNT(*),已批准数用条件计数,总额用 SUM(amount),已批准额用条件求和。月份用 DATE_FORMAT 截取年月作为分组键。

参考解法

SELECT DATE_FORMAT(trans_date, '%Y-%m') AS month,
    country,
    COUNT(*) AS trans_count,
    COUNT(IF(state = 'approved', 1, NULL)) AS approved_count,
    SUM(amount) AS trans_total_amount,
    SUM(IF(state = 'approved', amount, 0)) AS approved_total_amount
FROM Transactions
GROUP BY month, country

易错点

  • 已批准笔数用 COUNT(IF(state = 'approved', 1, 0)) 是错的:COUNT 只跳过 NULL,0 也会被计数,必须返回 NULL 或改用 SUM。
  • country 可能为 NULL,会单独成组,按业务决定是否保留。
刷题进度保存在当前浏览器