【SQL笔试题】以月为单位汇总交易成功金额与交易失败的金额
下面给出一条适用于 MySQL (及与其语法高度兼容的数据库) 的查询语句,按“年-月”分组统计每个月的• 成功交易金额(status = 'Success')• 失败交易金额(status = 'Failed')并保证当某个月缺少其中一种状态时金额显示 0,而不是 NULL;结果按月份从新到旧排序。```sqlSELECTDATE_FORMAT(transaction_date, '%Y-%m'
一、问题
有一张名为 transactions 的表,用于记录金融交易信息。表中包含交易ID、交易日期、交易类型、交易金额和交易状态字段。表结构如下:
各字段含义是:
id:交易的唯一标识符,使用整数类型(INT),并作为主键(PRIMARY KEY)来确保每个交易具有唯一的ID。
transaction_date:交易发生的日期,使用日期类型(DATE)来存储日期信息。
transaction_type:交易的类型,使用枚举类型(ENUM)来限制可选的值。在这个示例中,我们使用了三种类型:存款(Deposit),取款(Withdrawal)和转账(Transfer)。
amount:交易的金额,使用十进制类型(DECIMAL)来存储数值型数据,并使用(10,2)指定了最大总位数为10,其中包括小数点后的2位。
status:交易的状态,同样使用枚举类型(ENUM)来限制可选的值。在这个示例中,状态可以是成功(Success)、挂起(Pending)或失败(Failed)。
具体要求如下:
1、编写一条SQL查询语句,以按日期分组计算每个月的总交易成功金额(status = ‘Success’)和失败交易金额(status = ‘Failed’),并按月份从最新到最旧的顺序显示结果,该月没有的数据,显示0,不能留空白。排序不考虑年份,数据都是同一年的。
2、显示内容示例如下,金额随测试用例动态改变,输出的结构应与下表一致
month total_success_amount total_failed_amount
2023-08 1900.00 1500.00
2023-07 1800.00 0.00 这个题用sql做一下
二、答案
下面给出一条适用于 MySQL (及与其语法高度兼容的数据库) 的查询语句,按“年-月”分组统计每个月的
• 成功交易金额(status = ‘Success’)
• 失败交易金额(status = ‘Failed’)
并保证当某个月缺少其中一种状态时金额显示 0,而不是 NULL;结果按月份从新到旧排序。
SELECT
DATE_FORMAT(transaction_date, '%Y-%m') AS month,
ROUND(SUM(CASE WHEN status = 'Success' THEN amount ELSE 0 END), 2)
AS total_success_amount,
ROUND(SUM(CASE WHEN status = 'Failed' THEN amount ELSE 0 END), 2)
AS total_failed_amount
FROM
transactions
GROUP BY
DATE_FORMAT(transaction_date, '%Y-%m')
ORDER BY
month DESC; -- 最新月在前
解释
-
DATE_FORMAT(transaction_date, ‘%Y-%m’)
• 把日期截成 “2023-08” 这种文本,既可分组又符合输出格式要求。 -
CASE … THEN amount ELSE 0 END
• 只在匹配状态时累加金额;否则加 0,确保该列不会出现 NULL。 -
ROUND(…, 2)
• 保留两位小数,与题目示例一致(也可用 FORMAT)。 -
ORDER BY month DESC
• 数据都在同一年,直接按文本排序即可得到 “08 → 07 → 06 …” 的顺序。
运行后得到的列名和顺序符合题目示例:
month | total_success_amount | total_failed_amount
更多推荐
所有评论(0)