SQLAlchemy如何合并多行将列值转为逗号分隔字符串(SQL Server环境)
SQLAlchemy ORM 实现SQL Server发票行合并拼接方案
前置准备
首先确认你的SQL Server版本为2017及以上,只有该版本开始支持原生字符串聚合函数STRING_AGG,以下是ORM映射类参考示例(需替换为你实际的表名、列名映射规则):
from sqlalchemy import Column, Integer, String, Date from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Invoice(Base): __tablename__ = "你的实际表名" invoice_number = Column("Invoice Number", Integer, primary_key=True) invoice_date = Column("Invoice Date", Date, primary_key=True) item_name = Column("Item Name", String, primary_key=True)
核心查询代码
from sqlalchemy import func # 构造ORM查询 query_result = db.session.query( Invoice.invoice_number.label("Invoice Number"), Invoice.invoice_date.label("Invoice Date"), # 用DISTINCT保证拼接的是唯一值,分隔符指定为逗号 func.STRING_AGG(func.DISTINCT(Invoice.item_name), ",").label("Items") ).group_by( # 按发票号和发票日期两个字段分组合并 Invoice.invoice_number, Invoice.invoice_date ).all()
结果输出参考(可选)
如果需要按你给出的表格格式打印结果,可以参考以下代码:
print("| Invoice Number | Invoice Date | Items |") print("| -------------- | ------------ | ------------- |") for row in query_result: format_date = row.invoice_date.strftime("%d %b %y") print(f"| {row.invoice_number} | {format_date} | {row.Items} |")
低版本SQL Server兼容说明
如果你使用的是SQL Server 2016及以下版本,不支持STRING_AGG函数,需要改用FOR XML PATH的方式实现拼接,ORM层需要编写原生SQL片段调用,实现复杂度较高,建议优先升级数据库版本使用上述方案。
内容的提问来源于stack exchange,提问作者vipnambiar
相关产品推荐
相关产品推荐

