As usual, I forgot to add the attachment... Ladislav Lenart
On 21.3.2013 13:57, Ladislav Lenart wrote: > Hello. > > Perhaps something like this is what you are looking for? > > def q_union(): > s = session > q1 = s.query( > Movement.customer_id.label('customer_id'), > Movement.document_id.label('document_id'), > Movement.debt.label('debt_moved'), > literal(0.00).label('debt_total') > ) > q2 = s.query( > Debt.customer_id.label('customer_id'), > Debt.document_id.label('document_id'), > literal(0.00).label('debt_moved'), > Debt.debt.label('debt_total'), > ) > q3 = q1.union(q2).subquery() > q4 = session.query( > q3.c.customer_id, > q3.c.document_id, > func.sum(q3.c.debt_moved), > func.sum(q3.c.debt_total), > ).group_by(q3.c.customer_id, q3.c.document_id) > return q4 > > Call to `print q_union()` prints the following: > > SELECT > anon_1.customer_id AS anon_1_customer_id, > anon_1.document_id AS anon_1_document_id, > sum(anon_1.debt_moved) AS sum_1, > sum(anon_1.debt_total) AS sum_2 > FROM ( > SELECT > anon_2.customer_id AS customer_id, > anon_2.document_id AS document_id, > anon_2.debt_moved AS debt_moved, > anon_2.debt_total AS debt_total > FROM ( > SELECT > movement.customer_id AS customer_id, > movement.document_id AS document_id, > movement.debt AS debt_moved, > %(param_1)s AS debt_total > FROM movement > UNION > SELECT > debt.customer_id AS customer_id, > debt.document_id AS document_id, > %(param_2)s AS debt_moved, > debt.debt AS debt_total > FROM debt > ) AS anon_2 > ) AS anon_1 > GROUP BY anon_1.customer_id, anon_1.document_id > > I have attached a complete python script that you can run to verify if it's > correct. > > > HTH, > > Ladislav Lenart > > > On 21.3.2013 09:07, Alexey Vihorev wrote: >> Hi! >> >> >> >> I have this query: >> >> >> >> q1 =(s.query() >> >> .add_columns( >> >> Movement.customer_id, >> >> Movement.document_id, >> >> func.sum(Movement.debt).label('debt_moved'), >> >> literal(0.00).label('debt_total') >> >> ) >> >> .group_by(Movement.customer_id, Movement.document_id) >> >> ) >> >> >> >> q2 =(s.query(). >> >> add_columns( >> >> Debt.customer_id, >> >> Debt.document_id, >> >> literal(0.00).label('debt_moved'), >> >> Debt.debt.label('debt_total'), >> >> ) >> >> ) >> >> >> >> q3 =q1.union(q2) >> >> >> >> The problem is that I need to SUM() the resulting query (columns >> 'debt_moved', >> 'debt_moved' should be summed, grouped by customer_id, document_id), but so >> far all my attempts to use add_columns() and group_by() on q3 have failed. >> How >> should I handle this this? >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sqlalchemy" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email >> to sqlalchemy+unsubscr...@googlegroups.com. >> To post to this group, send email to sqlalchemy@googlegroups.com. >> Visit this group at http://groups.google.com/group/sqlalchemy?hl=en. >> For more options, visit https://groups.google.com/groups/opt_out. >> >> > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at http://groups.google.com/group/sqlalchemy?hl=en. For more options, visit https://groups.google.com/groups/opt_out.
# coding=utf-8 from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer from sqlalchemy.engine import create_engine from sqlalchemy.orm import scoped_session from sqlalchemy.orm.session import sessionmaker from sqlalchemy.sql.expression import func, literal Base = declarative_base() class Movement(Base): __tablename__ = 'movement' id = Column(Integer(), primary_key=True) customer_id = Column(Integer()) document_id = Column(Integer()) debt = Column(Integer()) class Debt(Base): __tablename__ = 'debt' id = Column(Integer(), primary_key=True) customer_id = Column(Integer()) document_id = Column(Integer()) debt = Column(Integer()) session = None def configure(): global session conn_string = 'postgresql+psycopg2://lada:heslo@localhost:5433/sandbox' engine = create_engine(conn_string, echo=True) session = scoped_session(sessionmaker(bind=engine, autoflush=False)) Base.metadata.bind = engine Base.metadata.create_all() def fill(): session.add_all([ Movement(customer_id=1, document_id=1, debt=1), Movement(customer_id=1, document_id=1, debt=2), Movement(customer_id=1, document_id=1, debt=1), Movement(customer_id=2, document_id=1, debt=1), Movement(customer_id=2, document_id=1, debt=2), ]) session.add_all([ Debt(customer_id=1, document_id=1, debt=1), Debt(customer_id=1, document_id=1, debt=2), Debt(customer_id=1, document_id=1, debt=1), Debt(customer_id=2, document_id=1, debt=1), Debt(customer_id=2, document_id=1, debt=2), ]) session.flush() def q_union(): s = session q1 = s.query( Movement.customer_id.label('customer_id'), Movement.document_id.label('document_id'), Movement.debt.label('debt_moved'), literal(0.00).label('debt_total') ) q2 = s.query( Debt.customer_id.label('customer_id'), Debt.document_id.label('document_id'), literal(0.00).label('debt_moved'), Debt.debt.label('debt_total'), ) q3 = q1.union(q2).subquery() q4 = session.query( q3.c.customer_id, q3.c.document_id, func.sum(q3.c.debt_moved), func.sum(q3.c.debt_total), ).group_by(q3.c.customer_id, q3.c.document_id) return q4 def show(q): print "Query:" print q print print "Results:" print q.all() def main(): configure() fill() q = q_union() show(q) if __name__ == '__main__': main()