You need tuple_()
, self_group()
, and a correlated subquery:
In [9]: from sqlalchemy import tuple_
In [10]: stmt = select([func.sum(data.c.x),
...: func.sum(data.c.y),
...: func.avg(data.c.x),
...: func.avg(data.c.y)]).\
...: where(data.c.group_id == summary.c.group_id)
In [11]: summary.update().\
...: values({ tuple_(summary.c.sum_x,
...: summary.c.sum_y,
...: summary.c.avg_x,
...: summary.c.avg_y).self_group(): stmt })
Out[11]: <sqlalchemy.sql.dml.Update object at 0x7ff76a80a908>
In [12]: print(_)
UPDATE summary SET (sum_x, sum_y, avg_x, avg_y)=(SELECT sum(data.x) AS sum_1, sum(data.y) AS sum_2, avg(data.x) AS avg_1, avg(data.y) AS avg_2
FROM data
WHERE data.group_id = summary.group_id)
The rest (executing etc.) is up to you, as the question is light on details.