首页 > 数据库 >力扣数据库1193. 每月交易 I

力扣数据库1193. 每月交易 I

时间:2024-10-12 19:47:28浏览次数:13  
标签:count -- 1193 approved 力扣 amount date trans 数据库

一、数据

表:Transactions

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

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

以 任意顺序 返回结果表。

查询结果格式如下所示。

示例 1:

输入:
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 |
+------+---------+----------+--------+------------+
输出:
+----------+---------+-------------+----------------+--------------------+-----------------------+
| 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                  |
+----------+---------+-------------+----------------+--------------------+-----------------------+

二、分析

1、由示例数据可以看出需要找出每个月和每个国家/地区的相关数据,因此需要对`trans_date`列和`country`进行GROUP BY分组计算,同时给的原始数据为`date`类型,因此也需要对`trans_date`列进行截取,提取年份和月份。

2、`state`列代表的就是该事务是否被批准,因为`state`列就有两个数据,因此可以使用IF函数删选被批准和未被批准的事务。

三、代码

select 
    substring(trans_date,1,7) as month, -- 对trans_date列进行截取,从1(头)开始,截取7位就能得到年份和月份
    country,
    count(id) as trans_count, -- 事务的总数
    count(if(state = 'approved',1,null)) as approved_count, -- 计算被批准的事务总数,IF(条件,值1,值2) --> 条件为真返回值1,为假返回值2,且count函数不计算为空值的情况
    sum(amount) as trans_total_amount, -- 总金额
    sum(if(state = 'approved',amount,0)) as approved_total_amount -- 计算被批准的事务的总金额,IF(条件,值1,值2) --> 条件为真返回值1,为假返回值2
from Transactions
group by month,country; -- 对月份和国家进行分组

四、总结

1、考察了IF函数的使用,IF(条件,值1,值2),条件为真,返回值1,反之返回值2。

2、考察了count函数的使用技巧,count函数计算行数,且自动跳过为空的行。

标签:count,--,1193,approved,力扣,amount,date,trans,数据库
From: https://blog.csdn.net/dhdbanwan/article/details/142861808

相关文章