力扣sql题-每月交易

145 阅读2分钟

题目:1193. 每月交易 I

难度:中等

要求:

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

任意顺序 返回结果表。

查询结果格式如下所示。

每月交易.png

思路:非常的混乱,第一次接触,又要查日期,又要统计,是一张表

结局:就感觉这样的sql写出来,很符合逻辑,是自己接触的太少 了!!!!!!!

分析:

  1. 使用到的函数说明:

​ a.使用到的函数:date_format

DATE_FORMAT(date, format) :用于以不同的格式显示日期/时间数据。date 参数是合法的日期,format 规定日期/时间的输出格式。

​ b.count函数,用于统计出现次数,常与group by 分组函数连用

​ c.if()条件判断 , 语法if(参数,true返回值,false返回值)

​ d.group by 分组函数

​ e. sum求和函数

2. 思路

​ a. 查找每个月和每个国家/地区。数据表中的 trans_date 是精确到日,我们可以使用 DATE_FORMAT() 函数将日期按照年月 %Y-%m 输出。比如将 2019-01-02 转换成 2019-01 。获取到所有的月份后,使用 GROUP BY 聚合每个月和每个国家的记录。

DATE_FORMAT(trans_date, '%Y-%m')

​ b.查找总的事务数,第一步已经将数据按月和国家聚合,只需要使用 COUNT 函数就能获取到总的事务数。

COUNT(*) AS trans_count

​ c.查找总金额。

使用 SUM 函数计算总金额。

SUM(amount) AS trans_total_amount

​ d.查找已批准的事物数。

已批准的事物的 state 标记为 approved。首先使用 IF 函数将 state = 'approved' 的记录标记为 1,否则为 NULL。再使用 COUNT 计算总量。

COUNT(IF(state = 'approved', 1, NULL)) AS approved_count

​ e.查找已批准的事物的总金额。

和第四步一样,先使用 IF 函数,再使用 SUM 函数。

SUM(IF(state = 'approved', amount, 0)) AS approved_total_amount

代码:

 select date_format(trans_date,'%Y-%m') month ,
 country,
 count(*) trans_count , 
 count(if(state='approved',1,null)) approved_count,
 sum(amount) trans_total_amount,
 sum(if(state='approved',amount,0)) approved_total_amount from Transactions
 group by month,country

补充一点:

为什么count(if(state='approved',1,null)) approved_count,是null,而不是0,count的原理是只要不是null值就都会进行统计,如果state='approved'不成立没有,count统计的值默认为0