sqlalchemy case when分组查询统计

这篇博客展示了如何使用SQLAlchemy ORM在Python中实现与原生SQL相似的功能,统计特定任务ID下设备的升级状态,包括成功、失败、未开始、取消和进行中的数量。通过案例代码解释了如何构建查询并获取结果,最终整理成字典格式进行展示。
摘要由CSDN通过智能技术生成

1.需求

根据过滤条件将设备按升级状态分组,统计总数和各个状态的数量。

2.原始数据

在这里插入图片描述

3.原生sql语句

select 
	count(*) as "total",
	sum(case when upgrade_status='failed' then 1 else 0 end) as "failed_count",
	sum(case when upgrade_status='unstarted' then 1 else 0 end) as "unstarted_count",
	sum(case when upgrade_status='cancelled' then 1 else 0 end) as "cancelled_count",
	sum(case when upgrade_status='upgrading' then 1 else 0 end) as "upgrading_count",
	sum(case when upgrade_status='succeed' then 1 else 0 end) as "succeed_count"
from edge_ota_record 
where task_id='73860eaffb014dba80db2f67518d5994' 
GROUP BY upgrade_status;

结果:
在这里插入图片描述

3.使用sqlalchemy

from sqlalchemy import func, case

statistics_dict = {}
qs = self.session.query(
                func.count().label("total"),
                func.sum(case(whens=[(self.model.upgrade_status == 'unstarted', 1)],else_=0)).label("unstarted_count"),
                func.sum(case(whens=[(self.model.upgrade_status == 'succeed', 1)],else_=0)).label("succeed_count"),
                func.sum(case(whens=[(self.model.upgrade_status == 'failed', 1)],else_=0)).label("failed_count"),
                func.sum(case(whens=[(self.model.upgrade_status == 'cancelled', 1)],else_=0)).label("cancelled_count"),
                func.sum(case(whens=[(self.model.upgrade_status == 'upgrading', 1)],else_=0)).label("upgrading_count"),
            ).filter(self.model.task_id == task_id).group_by(self.model.upgrade_status)
            
results = [dict(zip(result.keys(), result)) for result in qs.all()]

counter = collections.Counter()
for result_dict in results:
	counter.update(result_dict)
statistics_dict.update(dict(counter))

print(statistics_dict )

结果:

 # {"total": 18, "unstarted_count": 18, "upgrading_count": 0, "cancelled_count": 0, "failed_count": 0, "succeed_count": 0}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy中,你可以使用`case()`函数来模拟SQL的`CASE WHEN`语句。`case()`函数允许你在查询中进行条件判断,并返回不同的值。 以下是一个示例,演示如何在SQLAlchemy中使用`case()`函数: ```python from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy import case, select, text from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String # 创建数据库连接 engine = create_engine("your_database_connection_string") Session = sessionmaker(bind=engine) session = Session() # 定义数据模型 Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) age = Column(Integer) # 查询示例 query = select([ User.name, case( [ (User.age >= 18, "成年人"), (User.age < 18, "未成年人") ], else_="未知" ).label("age_group") ]) # 执行查询 result = session.execute(query) # 打印查询结果 for row in result: print(f"姓名: {row.name}, 年龄分组: {row.age_group}") ``` 在上面的示例中,我们首先导入了所需的模块和函数。 然后,我们定义了一个数据模型`User`,它对应数据库中的`users`表。 接下来,我们使用`case()`函数来模拟`CASE WHEN`语句。在`case()`函数中,我们指定了条件列表和对应的返回值。最后,我们使用`label()`函数给返回的值命名为`age_group`。 在查询示例中,我们使用`select()`函数指定要查询的字段,并使用`case()`函数作为一个字段来返回年龄分组。 最后,我们通过执行查询并打印结果来获取结果。 请注意,你需要将`"your_database_connection_string"`替换为你的实际数据库连接字符串。 希望这个示例能帮助你理解如何在SQLAlchemy中使用`case()`函数来模拟`CASE WHEN`语句。如果你有其他问题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值