一、问题

有一张名为 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;      -- 最新月在前

解释

  1. DATE_FORMAT(transaction_date, ‘%Y-%m’)
    • 把日期截成 “2023-08” 这种文本,既可分组又符合输出格式要求。

  2. CASE … THEN amount ELSE 0 END
    • 只在匹配状态时累加金额;否则加 0,确保该列不会出现 NULL。

  3. ROUND(…, 2)
    • 保留两位小数,与题目示例一致(也可用 FORMAT)。

  4. ORDER BY month DESC
    • 数据都在同一年,直接按文本排序即可得到 “08 → 07 → 06 …” 的顺序。

运行后得到的列名和顺序符合题目示例:

month | total_success_amount | total_failed_amount

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐