2011-10-24 26 views
3

これについての良い文書は見つかりませんでした。私はユーザーと注文金額のリストを持っており、注文金額上位10位のユーザーを表示したいと考えています。 SQLAlchemyでこのデータを十分に抽出するクエリを作成するのに問題がありました。これにアプローチするより良い方法はありますか?SQLAlchemyでの集計の集計

customers, amount = DBSession.query(Order.customer, func.sum(Order.amount).label('totalamount')).\ 
    group_by(Order.customer).\ 
    order_by(func.desc(totalamount)).\ 
    limit(10) 

for a, b in zip(customers, amount): 
    print a.name, str(amount) 

答えて

4
from sqlalchemy import * 
from sqlalchemy.orm import * 
from sqlalchemy.ext.declarative import declarative_base 
import random 

Base= declarative_base() 

class Customer(Base): 
    __tablename__ = 'customer' 
    id = Column(Integer, primary_key=True) 
    name = Column(Unicode) 
    orders = relationship("Order", backref="customer") 

class Order(Base): 
    __tablename__ = "order" 

    id = Column(Integer, primary_key=True) 
    customer_id= Column(Integer, ForeignKey('customer.id')) 
    amount = Column(Integer) 

e = create_engine("sqlite://", echo=True) 
Base.metadata.create_all(e) 

session = Session(e) 

session.add_all([ 
    Customer(name="c%d" % i, orders=[ 
     Order(amount=random.randint(10, 100)) 
     for j in xrange(random.randint(0, 5)) 
    ]) 
    for i in xrange(100) 
]) 

amount_sum = func.sum(Order.amount).label('totalamount') 
amount = session.query(Order.customer_id, amount_sum).\ 
      group_by(Order.customer_id).\ 
      order_by(amount_sum.desc()).\ 
      limit(10).\ 
      subquery() 

for a, b in session.query(Customer, amount.c.totalamount).\ 
    join(amount, amount.c.customer_id==Customer.id): 
    print a.name, b 

ここでパターンにいくつかのガイドラインがhttp://www.sqlalchemy.org/docs/orm/tutorial.html#using-subqueriesであるが、全体的に最初のSQLで開始します。

+0

この質問にも答えながら、これは私がiffyについてのSQLAlchemyの他の側面を理解するのにも役立ちました。 –