LeetCode-1193. 每月交易 I(中等)DATE_FORMAT COUNT sum(加条件)

Table: Transactions

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| country       | varchar |
| state         | enum    |
| amount        | int     |
| trans_date    | date    |
+---------------+---------+
id 是这个表的主键。
该表包含有关传入事务的信息。
state 列类型为 “[”批准“,”拒绝“] 之一。
 

编写一个 sql 查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。

查询结果格式如下所示:

Transactions table:
+------+---------+----------+--------+------------+
| id   | country | state    | amount | trans_date |
+------+---------+----------+--------+------------+
| 121  | US      | approved | 1000   | 2018-12-18 |
| 122  | US      | declined | 2000   | 2018-12-19 |
| 123  | US      | approved | 2000   | 2019-01-01 |
| 124  | DE      | approved | 2000   | 2019-01-07 |
+------+---------+----------+--------+------------+

Result table:
+----------+---------+-------------+----------------+--------------------+-----------------------+
| month    | country | trans_count | approved_count | trans_total_amount | approved_total_amount |
+----------+---------+-------------+----------------+--------------------+-----------------------+
| 2018-12  | US      | 2           | 1              | 3000               | 1000                  |
| 2019-01  | US      | 1           | 1              | 2000               | 2000                  |
| 2019-01  | DE      | 1           | 1              | 2000               | 2000                  |
+----------+---------+-------------+----------------+--------------------+-----------------------+

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/monthly-transactions-i
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

审题:编写一个 sql 查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。

每个月、每个国家,事物和总额,已经批复的总额。

思考:先按照日期和国家分组,然后求数量,以及总金额之类的数字。

解题:

关键点有两个:
1.使用DATE_FORMAT()函数把日期转换成月份
2.count()/sum()函数在聚合时加入条件
(sum()函数中返回0/count()函数中返回null可以过滤掉不符合记录)

--  Write your MySQL query statement below

SELECT DATE_FORMAT(trans_date, '%Y-%m') AS month, country
	, COUNT(1) 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

知识点:

DATE_FORMAT

COUNT

sum

DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据。

目前 LeetCode 官方并未发布一套完整的、公开的“SQL 基础 50 题及答案完整版”文档供直接获取。不过,用户可以通过 LeetCode 官网的“数据库”分类题目,手动整理出一系列基础题目及其解答,这些题目通常涵盖了 SQL 的常见操作,包括: - 基本查询(如选择列、过滤数据) - 条件筛选(如 WHERE 子句、LIKE、IN、BETWEEN) - 聚合函数(如 COUNTSUM、AVG、MAX、MIN) - 分组与分组过滤(GROUP BY、HAVING) - 多表连接(INNER JOIN、LEFT JOIN、RIGHT JOIN) - 子查询与嵌套查询 - 窗口函数(如 RANK、ROW_NUMBER、DENSE_RANK) - 日期函数与字符串函数 - 正则表达式(如 REGEXP) ### 示例题目解析 #### 示例 1:查找拥有有效邮件的用户 ```sql SELECT user_id, name, mail FROM Users WHERE mail REGEXP '^[a-zA-Z][a-zA-Z0-9\._\-]*@leetcode\\.com$'; ``` 此查询通过正则表达式筛选出符合特定格式的电子邮件地址,其中: - `^` 表示字符串的开始; - `[a-zA-Z]` 匹配第一个字母; - `[a-zA-Z0-9\._\-]*` 匹配后续可能的字母、数字、点、下划线或短横线; - `@leetcode\\.com` 匹配域名部分,注意在 SQL 中需使用双反斜杠进行转义; - `$` 表示字符串的结束[^1]。 #### 示例 2:查询性能分析 ```sql SELECT query_name, ROUND(AVG(rating / position), 2) AS quality, ROUND(100 * AVG(rating < 3), 2) AS poor_query_percentage FROM Queries GROUP BY query_name HAVING query_name IS NOT NULL; ``` 该查询计算每个查询名称的平均质量,并计算评分低于 3 的查询所占百分比。其中: - `AVG(rating < 3)` 利用布尔表达式将条件转换为 0 或 1,计算其平均值即为比例; - `ROUND(..., 2)` 保留两位小数; - `HAVING query_name IS NOT NULL` 排除空值记录[^2]。 #### 示例 3:员工唯一信息表查询 ```sql SELECT u.unique_id, e.name FROM Employees e JOIN UNI u ON e.id = u.id; ``` 此查询展示如何通过主键 `id` 将员工信息与唯一标识码关联,获取员工的唯一 ID 和姓名。 #### 示例 4:某月订单数量统计 ```sql SELECT p.product_name, SUM(o.unit) AS unit FROM Orders o LEFT JOIN Products p ON o.product_id = p.product_id WHERE DATE_FORMAT(o.order_date, "%Y-%m") = "2020-02" GROUP BY o.product_id HAVING SUM(o.unit) >= 100; ``` 该查询通过 `LEFT JOIN` 连接订单与产品表,筛选出 2020 年 2 月的订单,并按产品分组,筛选出总订单数量大于等于 100 的产品[^4]。 --- ### 获取完整题解的建议方式 1. **访问 LeetCode 官网**:进入 [LeetCode 数据库题目页面](https://leetcode.com/problemset/database/),按“频率”或“难度”排序,逐步练习并记录每道题的解法。 2. **使用 LeetCode 官方 App**:支持离线查看题目与提交记录,方便整理。 3. **GitHub 开源项目**:搜索如 `LeetCode-SQL-50` 等项目,许多开发者已整理出类似题集及答案。 4. **技术博客与论坛**:如 优快云、知乎、掘金等平台,常有用户分享 LeetCode SQL 刷题笔记。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值