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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:36:05