题目:1193. 每月交易 I
难度:中等
要求:
编写一个 sql 查询来查找每个月和每个国家/地区的事务数及其总金额、已批准的事务数及其总金额。
以 任意顺序 返回结果表。
查询结果格式如下所示。
思路:非常的混乱,第一次接触,又要查日期,又要统计,是一张表
结局:就感觉这样的sql写出来,很符合逻辑,是自己接触的太少 了!!!!!!!
分析:
- 使用到的函数说明:
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