You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中MySQL查询结果按金额、折扣金额、月份展示问题求助

解决Python中MySQL查询结果按月份分组并正确展示的问题

我明白你现在的困扰——在MySQL Workbench里能轻松实现的按月份统计金额和折扣金额的需求,放到Python代码里就出问题了。你的代码主要踩了两个常见坑,咱们一步步来解决:

原代码的核心问题

  • 游标不匹配:你用cursor1执行了第一个查询,却试图用cursor2.fetchall()获取结果,这肯定拿不到数据,因为cursor2根本没执行对应的查询语句
  • 缺少分组逻辑:两次单独查询不同月份的写法不仅冗余,还没利用SQL的分组功能,没法自动按月份汇总数据
  • 连接关闭错误:最后一行conn.close少了括号,这是个语法错误,没法正确关闭数据库连接

修正后的完整代码

下面是优化后的代码,一次性解决所有问题,还能输出清晰的表格样式结果:

#!/usr/bin/env python
import mysql.connector

conn = None
try:
    # 建立数据库连接
    conn = mysql.connector.Connect(
        host="localhost",
        user="root",
        password="Karimanzira1978!",
        database="classicmodels"
    )
    print("Connected to MySQL!")

    # 只用一个游标就足够,避免混淆
    cursor = conn.cursor()

    # 优化SQL:按年月分组,一次性统计所有目标月份的数据
    query = """
        SELECT 
            SUM(amount) AS amount,
            SUM(amount * 0.99) AS amount_discounted,
            DATE_FORMAT(paymentDate, '%Y-%m') AS month
        FROM payments
        WHERE paymentDate BETWEEN '2003-12-01' AND '2004-12-31'
        GROUP BY DATE_FORMAT(paymentDate, '%Y-%m')
        ORDER BY month;
    """

    cursor.execute(query)
    # 获取所有查询结果
    results = cursor.fetchall()

    # 打印表格表头
    print("\n查询结果:")
    print("| 金额(amount) | 折扣金额(amount_discounted) | 月份(month) |")
    print("|--------------|-----------------------------|-------------|")
    # 格式化输出每一行数据,保留两位小数更直观
    for row in results:
        print(f"| {row[0]:.2f} | {row[1]:.2f} | {row[2]} |")

except Exception as ex:
    print("无法连接MySQL:异常信息:" + str(ex))
finally:
    # 确保无论是否出错,都关闭游标和连接
    if conn is not None:
        cursor.close()
        conn.close()
        print("\n数据库连接已关闭。")

关键改进点说明

  1. SQL语句优化:

    • 用DATE_FORMAT(paymentDate, '%Y-%m')把日期转换成YYYY-MM的标准月份格式
    • 通过GROUP BY按月份分组,一次查询就能统计2003年12月到2004年12月的所有月份数据,无需重复写两次查询
    • ORDER BY month保证结果按时间顺序排列,更易读
  2. 游标使用规范:

    • 只创建一个游标对象,执行查询和获取结果用同一个游标,彻底避免游标不匹配的问题
  3. 表格样式输出:

    • 手动打印表头和分隔线,把查询结果格式成类似Markdown表格的样式,比直接打印元组清晰得多
    • 用:.2f格式化金额,保留两位小数,符合财务数据的展示习惯
  4. 资源管理完善:

    • 用finally块确保游标和连接一定会被关闭,避免数据库连接泄漏

内容的提问来源于stack exchange,提问作者Chinyama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:04:48