2011-11-17 14 views
0

私はFooのタイプごとに1つの行であるFoosのリストであるテーブル(foos)を持っています。 2番目のテーブル(アイテム)は、各行がFooのタイプと金額(およびその他の情報)であるリストです。たとえば、Foo3,45.2およびFoo2,12.34などです。python sqlite3各タイプの合計

Fooの各タイプの金額の合計を決定したいと考えています。

これは私の既存のコードですが、より良い(複数の標準または効率的な)方法がなければならない:

cursor.execute('''select type from foos''') 
foo_types = cursor.fetchall() 
results = [] 
for ft in foo_types: 
    cursor.execute('''select sum(amount) from items 
     where foo_type =?''', ft) 
    results.append((ft, cursor.fetchone())) 

私はこれをどのようにコーディングする必要がありますか?

+1

SOのシンタックスハイライトは、あなたのコードに問題があると私に語りました。 – eumiro

+0

私は実行行の最後に余分な '' 'を置きます。一定。 – foosion

答えて

2
SELECT foo_type, SUM(amount) 
FROM items 
GROUP BY foo_type 

あなたはすでに各foo_typeと対応するsum 1つのクエリ内で提供します。そこから辞書を構築し、それを使って最初のクエリからデータを展開することができます。

または1つのクエリにすべてをかける:

cursor.execute("SELECT foo_type, SUM(amount) " 
       "FROM items, foos " 
       "WHERE items.foo_type = foos.type " 
       "GROUP BY foo_type") 
results = list(cursor) 

# results is a list of tuples: [(type1, sum1), (type2, sum2), ...] 
+0

の項目とfooは両方とも列名 'type'を使用します。 2番目のバージョンを実行すると、次のようになります。sqlite3.OperationalError:あいまいな列名:行単位で入力します。私はitems.typeでグループを試みましたが、それは助けになりませんでした。最初のバージョンは完全に機能しました – foosion

関連する問題