首页 > 其他分享 >1205. 每月交易 II

1205. 每月交易 II

时间:2024-11-28 23:29:35浏览次数:12  
标签:每月 1205 Transactions II -- amount 冲正 trans id

目录

题目链接(无_力扣VIP_略过)

1.读题(建议使用这种表结构_数据对比看)

__________________________________________

在这里插入图片描述

题目SQL Schema建表语句_数据
Create table If Not Exists Transactions (id int, country varchar(4), state enum('approved', 'declined'), amount int, trans_date date)

Create table If Not Exists Chargebacks (trans_id int, trans_date date)

Truncate table Transactions
insert into Transactions (id, country, state, amount, trans_date) values ('101', 'US', 'approved', '1000', '2019-05-18')
insert into Transactions (id, country, state, amount, trans_date) values ('102', 'US', 'declined', '2000', '2019-05-19')
insert into Transactions (id, country, state, amount, trans_date) values ('103', 'US', 'approved', '3000', '2019-06-10')
insert into Transactions (id, country, state, amount, trans_date) values ('104', 'US', 'declined', '4000', '2019-06-13')
insert into Transactions (id, country, state, amount, trans_date) values ('105', 'US', 'approved', '5000', '2019-06-15')
Truncate table Chargebacks
insert into Chargebacks (trans_id, trans_date) values ('102', '2019-05-29')
insert into Chargebacks (trans_id, trans_date) values ('101', '2019-06-30')
insert into Chargebacks (trans_id, trans_date) values ('105', '2019-09-18')

2.答案_一图解

一图解

在这里插入图片描述

答案

-- 方法1
WITH e1 AS (  -- 创建一个公共表表达式 (CTE) 名为 e1
    SELECT LEFT(trans_date, 7) AS month, id,  -- 从 Transactions 表中提取交易日期的年月部分作为 month,并选取 id
           country, state, amount  -- 选择国家、状态和金额
    FROM transactions
    UNION ALL  -- 合并下一个查询的结果

    SELECT LEFT(c.trans_date, 7) AS month, trans_id AS id,  -- 从 Chargebacks 表中提取冲正日期的年月部分,并将交易 ID 作为 id
           country, NULL AS state, amount  -- 选择国家,状态设为 NULL,选取金额
    FROM Chargebacks c
    JOIN transactions t ON c.trans_id = t.id  -- 通过交易 ID 连接 Chargebacks 和 Transactions 表
)

SELECT month, country,  -- 从 CTE e1 中选择月份和国家
    COUNT(IF(state='approved', id, NULL)) AS approved_count,  -- 计算每个月每个国家的批准数量(状态为 'approved')
    SUM(IF(state='approved', amount, 0)) AS approved_amount,  -- 计算每个月每个国家的批准总金额
    COUNT(IF(state IS NULL, id, NULL)) AS chargeback_count,  -- 计算每个月每个国家的冲正数量(状态为 NULL)
    SUM(IF(state IS NULL, amount, 0)) AS chargeback_amount  -- 计算每个月每个国家的冲正总金额
FROM e1
GROUP BY month, country  -- 按月份和国家分组
HAVING approved_amount > 0 OR chargeback_amount > 0;  -- 只返回批准金额大于 0 或冲正金额大于 0 的结果
-- 可以缩写为 approved_amount or chargeback_amount
-- 最好不要怎么写, 真的真的一点都不好理解, 类似 avg(字段=条件), 我就不说了

-- 方法2
SELECT month, country,
    COUNT(IF(tag=1, 1, NULL)) AS approved_count,  -- 计算每个月每个国家的批准数量(tag=1表示批准)
    SUM(IF(tag=1, amount, 0)) AS approved_amount,  -- 计算每个月每个国家的批准总金额
    COUNT(IF(tag=0, 1, NULL)) AS chargeback_count, -- 计算每个月每个国家的冲正数量(tag=0表示冲正)
    SUM(IF(tag=0, amount, 0)) AS chargeback_amount  -- 计算每个月每个国家的冲正总金额
FROM (
    SELECT country, amount, 1 AS tag,  -- 从 Transactions 表中选取国家、金额,标记为批准(tag=1)
    date_format(trans_date, '%Y-%m') AS month  -- 将交易日期格式化为 'YYYY-MM' 格式作为月份
    FROM Transactions
    WHERE state='approved'  -- 只选择状态为 'approved' 的交易记录

    UNION ALL  -- 合并批准记录和冲正记录

    SELECT country, amount, 0 AS tag,  -- 从 Chargebacks 表中选取国家、金额,标记为冲正(tag=0)
    date_format(c.trans_date, '%Y-%m') AS month  -- 将冲正日期格式化为 'YYYY-MM' 格式作为月份
    FROM Transactions AS t RIGHT OUTER JOIN Chargebacks AS c  -- 右外连接 Transactions 和 Chargebacks 表
    ON t.id = c.trans_id  -- 通过交易 ID 进行连接
) AS temp  -- 将上述合并结果作为临时表 temp
GROUP BY month, country;  -- 按照月份和国家分组,计算批准和冲正的数量和金额


------------------------------------------------------------------------------

解题分析图览

方法1
创建CTE e1 从Transactions表中提取年月、id、国家、状态和金额 从Chargebacks表中提取年月、交易ID、国家和金额 通过交易ID连接Chargebacks和Transactions表 合并两个查询结果 从CTE e1中选择月份和国家 计算批准数量和金额 计算冲正数量和金额 按月份和国家分组 过滤出批准或冲正金额大于0的结果
方法2
创建临时表temp 从Transactions表中选取国家、金额,标记为批准 将交易日期格式化为'YYYY-MM'格式作为月份 只选择状态为'approved'的交易记录 从Chargebacks表中选取国家、金额,标记为冲正 将冲正日期格式化为'YYYY-MM'格式作为月份 右外连接Transactions和Chargebacks表 通过交易ID进行连接 合并批准记录和冲正记录 从临时表temp中选择数据 计算批准数量和金额 计算冲正数量和金额 按月份和国家分组

难点分析

  1. 数据合并:需要将Transactions表和Chargebacks表的数据合并,以便于后续的计算和分析。
  2. 状态判断:需要根据交易的状态(approved或declined)以及是否存在冲正记录来计算批准和冲正的数量和金额。
  3. 日期格式化:需要将交易日期和冲正日期格式化为’YYYY-MM’格式,以便于按月份进行分组和计算。
  4. 分组计算:需要按月份和国家进行分组,并计算每个组内的批准和冲正数量和金额。
  5. 结果过滤:需要过滤出批准或冲正金额大于0的结果,以避免显示无意义的数据。

关键总结

  1. CTE(公共表表达式)的使用:通过创建CTE来合并和处理数据,使查询更加清晰和易于理解。
  2. 条件聚合函数的使用:使用COUNT和SUM函数结合IF条件来计算批准和冲正的数量和金额。
  3. 日期函数的使用:使用LEFT或DATE_FORMAT函数来提取或格式化日期,以便于按月份进行分组和计算。
  4. JOIN操作的使用:通过JOIN操作来连接不同的表,以便于获取所需的数据。
  5. GROUP BY和HAVING子句的使用:通过GROUP BY子句按月份和国家进行分组,并通过HAVING子句过滤出有意义的结果。

标签:每月,1205,Transactions,II,--,amount,冲正,trans,id
From: https://blog.csdn.net/weixin_74002941/article/details/144077481

相关文章

  • 代码随想录算法训练营第二十八天| leetcode122.买卖股票的最佳时机 II、leetcode55.
    1leetcode122.买卖股票的最佳时机II题目链接:122.买卖股票的最佳时机II-力扣(LeetCode)文章链接:代码随想录视频链接:贪心算法也能解决股票问题!LeetCode:122.买卖股票最佳时机II_哔哩哔哩_bilibili思路:自己不知道怎么写出来的一道题目,就觉得理解上面就是找到了方法,但是后面再......
  • ROCKCHIP --- IIC
    文章目录一、IIC子系统编程(一)分配并初始化对象(二)IIC驱动框架(三)IIC的regmap函数1.初始化IIC的寄存器映射2.写入寄存器3.读取寄存器(二)打印调试信息一、IIC子系统编程(一)分配并初始化对象structi2c_driver{ //入口函数 int(*probe)(structi2c_client*client,......
  • H.264/H.265播放器EasyPlayer.js网页全终端安防视频流媒体播放器IIS下wasm返回404错误
    EasyPlayer.js网页全终端安防视频流媒体播放器是TSINGSEE青犀流媒体组件系列中关注度较高的产品,经过多年的发展和迭代,目前已经有多个应用版本,包括RTSP版、RTMP版、Pro版,以及js版,其中js版本作为网页播放器,受到了用户的广泛使用。在功能上,EasyPlayer播放器支持直播、点播、录像、......
  • 【每日一题】 3208. 交替组 II
    给你一个整数数组 colors 和一个整数 k ,colors表示一个由红色和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i] :colors[i]==0 表示第 i 块瓷砖的颜色是 红色 。colors[i]==1 表示第 i 块瓷砖的颜色是 蓝色 。环中连续 k 块瓷砖的颜色如果是 交替 ......
  • leetcode3208. 交替组 II
    循环数组问题,指针问题代码比较好实现的,只需要对右端点维护,如果达到了>=k便可以被计数,循环数组可以两边循环做到点击查看代码classSolution{publicintnumberOfAlternatingGroups(int[]colors,intk){intn=colors.length;intans=0;......
  • [luoguSP10707] Count on a tree II
    题意原题链接给定一棵树,节点\(i\)上有颜色\(c_i\),多次询问,每次查询两点之间的路径中的不同颜色数。sol这是一道类似普通莫队[luoguSP3267]D-query的题目,但是是在树上询问的,因此考虑将树转化为序列计算。将树转化为序列包括DFS序,欧拉序和树链剖分三种,树链剖分复杂度更......
  • 2024年11月27日 比较字符的ASCII码值
    浅浅的随笔`#define_CRT_SECURE_NO_WARNINGS1//创建一个字符chara[10]//键盘输入十个字母并输出//找出ASCII最大值和最小值的字母//对数组进行排序(降序)#include<stdio.h>#defineN10intmain(){ chararr[N]={0};//创建数组 inti=0; printf("输入10个字......
  • 代码随想录:四数相加 II
    代码随想录:四数相加II我还以为会有更快的速度呢。。没想到最佳答案就是n^2不过值得一提的,这题一开始可能会想到用multiset来解决重复出现的元素,但实际上,multiset的查询速度是logn,是不如用哈希表的,所以用unordered_map,用键值对的值来表示元素出现的次数。classSolution{publ......
  • LeetCode【0227】基本计算器 II
    本文目录1中文题目2Python求解2.1求解思路2.2涉及方法2.3求解示例2.4Python代码2.5复杂度分析3题目总结1中文题目给定一个字符串表达式s,请实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。可以假设给定的表达式总是有效的。所有中间结......
  • 代码随想录算法训练营day55 day57| 108.冗余连接 109.冗余连接II 53.寻宝
    学习资料:https://www.programmercarl.com/kamacoder/0108.冗余连接.html#思路图论并查集prim算法kruskal算法学习记录:108.冗余连接点击查看代码#并查集解法classUnionFind:def__init__(self,size):self.parent=list(range(size+1))deffind(se......