Here is a simple Oracle table:
+-----------+---------+
| food | person |
+-----------+---------+
| pizza | Adam |
| pizza | Bob |
| pizza | Charles |
| ice cream | Donald |
| hamburger | Emma |
| hamburger | Frank |
+-----------+---------+
And here are the results of an aggregated SELECT I'd like to do:
+-----------+------------------+
| food | people |
+-----------+------------------+
| hamburger | Emma,Frank |
| ice cream | Donald |
| pizza | Adam,Bob,Charles |
+-----------+------------------+
With Oracle 11g+ this is easy enough with a LISTAGG:
SELECT food, LISTAGG (person, ',') WITHIN GROUP (ORDER BY person) AS people
FROM mytable
GROUP BY food;
But I haven't been able to find a way to do this within SQLAlchemy. An old question from Stack Overflow shows where someone was trying to implement a custom class to do the job, but is that really the best option there is?
MySQL has a group_concat feature, and thus this questioner solved his problem with func.group_concat(...). Sadly that function is not available within Oracle.
解决方案In [7]: func.listagg(column('person'), ',').within_group(column('person'))
Out[7]:
In [8]: print(_.compile(dialect=oracle.dialect()))
listagg(person, :listagg_1) WITHIN GROUP (ORDER BY person)