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() 函数用于以不同的格式显示日期/时间数据。

### Shein SQL 笔试相关题目与准备经验 #### 一、SQL笔试常见考察点 SQL笔试通常会围绕以下几个核心知识点展开,结合Shein的实际业务场景,可能会涉及更复杂的查询和数据分析能力。 1. **基础查询与过滤** - 使用`SELECT`语句进行数据检索,并结合`WHERE`子句实现条件过滤。例如,筛选特定时间范围内的订单记录[^3]。 - 示例代码: ```sql SELECT user_id, pay_time, sku FROM dw_order_detail_df WHERE pay_time >= '2025-10-15 00:00:00' AND cate_nm IN ('C++', 'Java', 'Python'); ``` 2. **连接操作** - 使用`JOIN`语句将多个表的数据进行关联。例如,将订单信息表与用户信息表通过`LEFT JOIN`连接起来[^3]。 - 示例代码: ```sql SELECT o.user_id, c.source FROM dw_order_detail_df AS o LEFT JOIN client_info AS c ON o.user_id = c.user_id; ``` 3. **聚合函数与分组** - 使用`COUNT`、`SUM`等聚合函数对数据进行统计分析,并结合`GROUP BY`实现分组计算。例如,统计每个月不同品类的用户数量[^4]。 - 示例代码: ```sql SELECT DATE_FORMAT(pay_time, '%Y-%m') AS month, cate_nm, COUNT(DISTINCT user_id) AS user_count FROM dw_order_detail_df GROUP BY month, cate_nm; ``` 4. **窗口函数** - 使用窗口函数(如`ROW_NUMBER()`、`RANK()`、`COUNT() OVER()`)实现更复杂的排序或统计需求。例如,计算每个用户的订单数量并按来源排序[^3]。 - 示例代码: ```sql SELECT user_id, source, COUNT(*) OVER (PARTITION BY user_id) AS order_count FROM dw_order_detail_df; ``` 5. **索引优化** - 确保查询性能时,合理设计索引。主键字段、外键字段以及`WHERE`子句中频繁使用的字段通常是索引的最佳候选[^2]。 --- #### 二、Shein SQL笔试经验分享 根据过往的经验总结,以下是一些针对Shein SQL笔试的有效准备策略: 1. **熟悉实际业务场景** - Shein作为一家电商平台,其SQL笔试题可能与订单管理、用户行为分析、商品分类统计等相关。因此,需要了解电商行业的常见数据模型和分析需求。 2. **练习复杂查询** - 多练习涉及多表连接、窗口函数、子查询等复杂查询的题目。例如,计算某个时间段内用户的复购率或新老用户分布。 3. **注重性能优化** - 在编写SQL时,考虑查询效率问题。例如,合理使用索引减少扫描范围,避免不必要的全表扫描[^2]。 4. **模拟真实环境** - 使用工具(如MySQL、PostgreSQL)搭建本地数据库,导入样例数据进行实战演练。这样可以更好地理解SQL语句在实际场景中的运行效果。 --- #### 三、推荐学习资源 以下是几类有助于Shein SQL笔试准备的学习资源: 1. **在线题库** - 牛客网、LeetCode、HackerRank等平台提供了大量SQL相关的练习题,涵盖从基础到高级的各种难度级别[^3]。 2. **官方文档** - 阅读数据库系统的官方文档(如MySQL、PostgreSQL),深入理解SQL语法及性能调优技巧。 3. **案例分析** - 学习其他公司(如阿里巴巴、字节跳动)的SQL笔试真题解析,积累解题思路和方法。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值