SQLAlchemy 中使用 GroupBy 和 Sum 导致重复计数的问题及解决方法

news2024/9/20 14:37:17

在 SQLAlchemy 中使用 GroupBySum 时,有时会遇到重复计数或意外的查询结果。这通常是因为在聚合查询中没有正确地指定聚合函数或 GroupBy 条件,导致结果集没有按预期方式分组。

在这里插入图片描述

1、问题背景

在使用 SQLAlchemy 进行数据查询时,用户在尝试对表中的几个字段进行分组并对各组进行求和时遇到问题。然而,在实际查询结果中,求和结果被重复计数,导致不正确的数据。

2、解决方案

为了解决这个问题,需要对查询语句进行调整。具体来说,原始的查询语句中存在一些问题:

  1. 在对 Expense 表进行分组时,同时选择了 Expense 对象,这没有意义。
  2. CostCenter 和 Expense 表之间缺少连接条件,导致行被重复,每个成本中心都进行计数,但没有关系。

因此,需要将查询语句修改为如下形式:

session.query(
    Expense.date,
    func.sum(Expense.value).label('total')
).join(Expense.cost_center
).filter(CostCenter.id.in_([2, 3])
).group_by(Expense.date
).all()

修改后的查询语句具有以下特点:

  1. 只选择 Expense.date 和求和结果 total,避免了重复选择 Expense 对象。
  2. 使用 join() 方法连接 CostCenter 和 Expense 表,确保只对相关行进行分组和求和。
  3. 使用 filter() 方法过滤出符合条件的 CostCenter,指定了要考虑的成本中心 ID。
  4. 使用 group_by() 方法对 Expense.date 进行分组,以便对每组进行求和。

通过这些修改,可以正确地对数据进行分组和求和,避免了重复计数的问题。

代码示例

以下是一个简单的可运行示例,演示了如何使用修改后的查询语句进行数据分组和求和:

from datetime import datetime
from sqlalchemy import create_engine, Column, Integer, ForeignKey, Numeric, DateTime, func
from sqlalchemy.orm import Session, relationship
from sqlalchemy.ext.declarative import declarative_base

# 创建引擎和会话
engine = create_engine('sqlite://', echo=True)
session = Session(bind=engine)

# 定义表结构
Base = declarative_base(bind=engine)

class CostCenter(Base):
    __tablename__ = 'cost_center'

    id = Column(Integer, primary_key=True)

class Expense(Base):
    __tablename__ = 'expense'

    id = Column(Integer, primary_key=True)
    cost_center_id = Column(Integer, ForeignKey(CostCenter.id), nullable=False)
    value = Column(Numeric(8, 2), nullable=False, default=0)
    date = Column(DateTime, nullable=False)

    cost_center = relationship(CostCenter, backref='expenses')

# 创建表
Base.metadata.create_all()

# 添加数据
session.add_all([
    CostCenter(expenses=[
        Expense(value=10, date=datetime(2014, 8, 1)),
        Expense(value=20, date=datetime(2014, 8, 1)),
        Expense(value=15, date=datetime(2014, 9, 1)),
    ]),
    CostCenter(expenses=[
        Expense(value=45, date=datetime(2014, 8, 1)),
        Expense(value=40, date=datetime(2014, 9, 1)),
        Expense(value=40, date=datetime(2014, 9, 1)),
    ]),
    CostCenter(expenses=[
        Expense(value=42, date=datetime(2014, 7, 1)),
    ]),
])

# 执行查询
base_query = session.query(
    Expense.date,
    func.sum(Expense.value).label('total')
).join(Expense.cost_center
).group_by(Expense.date)

# 第一次查询,考虑成本中心 1
for row in base_query.filter(CostCenter.id.in_([1])).all():
    print('{}: {}'.format(row.date.date(), row.total))

# 第二次查询,考虑成本中心 1、2 和 3
for row in base_query.filter(CostCenter.id.in_([1, 2, 3])).all():
    print('{}: {}'.format(row.date.date(), row.total))

在执行查询后,它将按日期对数据进行分组并求和,并显示每个组的日期和总和。这样,可以正确地获取数据分组和求和的结果,避免重复计数的问题。

在使用 SQLAlchemy 的 GroupBySum 时,可能会遇到重复计数的问题。通常,这是由于没有正确处理聚合逻辑或缺乏对 SQL 查询的深入理解。通过正确使用聚合函数,并在需要时检查生成的 SQL 语句,可以避免这些问题,确保查询结果的准确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2044599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

入门 - vue整个过程的生命周期详解

生命周期概念 Vue的生命周期就是vue实例从创建到销毁的全过程,也就是new Vue()开始就是vue生命周期的开始。Vue 实例有⼀个完整的⽣命周期,也就是从开始创建、初始化数据、编译模版、挂载Dom->渲染、更新->渲染、卸载 等⼀系列过程,称…

无人机灯光含义的详解!!!

一、LED指示灯和状态指示灯 LED指示灯:通常位于飞行器的头部机臂上,用于显示无人机的当前状态。 状态指示灯:位于尾部机臂上,提供更多关于无人机状态的信息。 红绿黄灯交替闪烁 表示无人机正在进行系统自检。稍等片刻&#xf…

Mybatis获取主键自增的方法

原本的方法 使用原本的JDBC去获取主键自增的方法如下图所示: 在这段代码中,通过连接对象 conn 的 prepareStatement 方法创建了一个PreparedStatement对象,并将SQL语句和 RETURN_GENERATED_KEYS 常量作为参数传递给该方法。这意味着执行SQL…

使用 Python 创建 Windows 程序列表生成器:从安装程序到配置文件

在当今的数字时代,我们的计算机上安装了数不胜数的程序。但是,您是否曾想过如何快速获取所有已安装程序的列表,并将其转化为可用的配置文件?今天,我们将探讨如何使用 Python 创建一个强大的工具,它不仅可以…

StarRocks Lakehouse 快速入门——Apache Paimon

StarRocks Lakehouse 快速入门指南为您提供了湖仓技术概览,旨在帮助您迅速掌握其核心特性、独特优势和应用场景。本指南将指导您如何高效地利用 StarRocks 构建解决方案。文章末尾,我们集合了来自阿里云、饿了么、喜马拉雅和同程旅行等行业领导者在 Star…

【私有云场景案例分享①】高效的集群管理能力

一、前言 设备的管理对企业至关重要,会影响生产效率、成本控制和竞争力。然而,企业在设备管理上面临设备数量多、设备分布广、维护成本高等挑战。DeviceKeeper设备管理网站作为解决方案,可以通过远程设备监控、远程设备维护和包体共享等功能…

制造业MES系统源码,前端框架:vue.js,后端框架:springboot 功能模块包括:生产计划管理、物料管理、工艺管理、设备管理、

MES系统功能模块解析,MES系统源码 MES系统是一种用于协调和优化制造过程的信息管理系统,可以帮助企业实现生产计划的顺利执行,并提供全面的生产监控和数据分析功能。 MES系统常见的功能模块包括生产计划管理、物料管理、工艺管理、设备管理…

如何把Phalcon 集成到PhpStorm里面

一 背景 按照上一篇文章里面写的Phalcon 创建项目过程中的一些坑, 最终我们在终端可以基于Phalcon命令创建对应的开发项目。但在这个过程中,存在一个问题:那就是写代码的时候,发现Phalcon对应的依赖提示都没有,如下: 从上面这个截图来看,就能发现,Phalcon的啥…

音频剪辑在线工具哪个好?分享5款简单易上手的音频剪辑工具

暑期的泰山人山人海,游客们纷纷涌向这座名胜古迹。站在巍峨的泰山之巅,望着脚下绵延的群山和眼前无边的云海,人们不禁会想要记录下这一刻的声音。 但泰山的风声、游客的喧哗声、还有自然与人文的杂音交织在一起,要想将这声音中的…

【人工智能】 使用线性回归预测波士顿房价 paddlepaddle 框架 飞桨

一、简要介绍 经典的线性回归模型主要用来预测一些存在着线性关系的数据集。 回归模型可以理解为:存在一个点集,用一条曲线去拟合它分布的过程。如果拟合曲线是一条直线,则称为线性回归。 如果是一条二次曲线,则被称为二次回归。 线性回归是回归模型中最简单的一种。 本…

机房监控系统,全面监控机房动力环境实时报警@卓振思众

在现代企业运营中,机房作为计算机系统的核心支撑平台,承载着关键数据和应用的稳定运行。因此,保障机房环境的安全和设备的正常运行至关重要。【卓振思众】机房监控系统,作为一种先进的智能管理工具,正是为了实现这一目…

启发式算法之模拟退火算法

文章目录 1. 模拟退火算法概述1.1 算法起源与发展1.2 算法基本原理 2. 算法实现步骤2.1 初始化过程2.2 迭代与降温策略 3. 模拟退火算法的优化策略3.1 冷却进度表的设计3.2 参数调整与策略 4. 模拟退火算法的应用领域4.1 组合优化问题4.1.1 旅行商问题(TSP&#xff…

Halcon阈值处理的几种分割方法

Halcon阈值处理的几种分割方法 文章目录 Halcon阈值处理的几种分割方法1. 全局阈值2. 基于直方图的自动阈值分割方法3. 自动全局阈值分割方法4. 局部阈值分割方法5. var_threshold算子6 . char_threshold 算子7. dual_threshold算子 在场景中选择物体或特征是图像测量或识别的重…

982200419控制燃烧器可面价

982200419控制燃烧器可面价 982200419控制燃烧器可面价 982200419控制燃烧器可面价 982200419控制燃烧器接线图 982200419控制燃烧器说明书 982200419控制燃烧器线路图 982200419燃烧机也叫燃烧器,按照燃料可分为燃油燃烧机和燃气燃烧机、生物质燃烧机&#x…

胡玫导演《红楼梦之金玉良缘》今日公映 李越版“琏二爷”实力不凡

今日,由胡玫执导,何燕江编剧,林鹏、卢燕、边程、张淼怡、李越等主演的电影《红楼梦之金玉良缘》全国公映。电影改编自曹雪芹不朽名著《红楼梦》,以“宝、黛、钗”三人的情缘纠葛入手,从“木石前盟”看“金玉良缘”&…

YOLOv8更换主干网络成MobileNetV3

目录 1. 添加主干网络模块 ​编辑1.1 在init.py中添加模块名 1.2 主体代码中添加调用语句块 2. 配置yaml文件 3. 修改成功 1. 添加主干网络模块 1.1 在init.py中添加模块名 1.2 主体代码中添加调用语句块 2. 配置yaml文件 3. 修改成功 自己随便找一个程序跑一跑验证…

Idea使用Maven下载源码

如题,Idea中使用Maven下载源码提示Cannot download sources for xxx。原因是在对应的镜像站没有找到源码包。笔者尝试下载spring-web-4.3.0.RELEASE的源码包时提示如此,原因是配置的阿里云镜像站没有上传对应的源码包,配置了华为镜像站后就可…

Linux(离线)内网部署 thingsboard-gateway 网关实战modbus通讯

前面我们讲解了在内网上如何部署Thingsboard,部署之后领导又要求部署上网关,然后通过modbus来监听设备,废话不多说,直接上干活。 第一步:下载thingsboard-gateway安装包 在Thingsboard官网中给了我们一个在线安装的地…

考勤系统微信小程序的设计与实现---附源码29756

目 录 1 绪论 1.1研究背景 1.2研究意义 1.3微信小程序的介绍 2考勤系统微信小程序系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4本章小…

计算机的错误计算(六十)

摘要 用另一种方法计算计算机的错误计算(五十五)中案例:先使自变量与 取余,再计算取余后的余弦值,这时,得到了不同的输出。因此,即使不清楚正确结果,Python 与 Visual Studio 也各自…