2017-11-21 1 views
2

집계 공유 합계가 0 인 모든 그룹을 필터링하려면 어떻게합니까?SQLAlchemy : 집계 후 필터링 방법

q = session.query(Trades.ticker, func.sum(Trades.shares)) 
g = q.group_by(Trades.ticker) 
f = g.filter(func.sum(Trades.shares) != 0) 
result = f.all() 

이 3 행에 오류가 발생합니다 :

... sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) misuse of aggregate: sum() ...

해결 방법은 필터를 제거하는 것입니다 :

result = [x for x in g.all() if x[1] != 0.0] 

을하지만 이것은 SQL 쿼리를 필터링에 비해 매우 느립니다 .

은 (간단히 수정 됨.)

+0

다소 관련 : https://stackoverflow.com/questions/648083/sql-error-misuse-of-aggregate –

답변

2

오케이 대답은 having()를 사용하는 것이다. related을 참조하십시오.

q = session.query(Trades.ticker, func.sum(Trades.shares)) 
g = q.group_by(Trades.ticker) 
f = g.having(func.sum(Trades.shares) != 0) 
result = f.all() 

니스, 간단하고 빠른.

질문을 작성하면 명확하게 생각할 수있게 도와 주었고 문서에서 답을 찾는데 도움이되었습니다. 이걸 누군가에게 도움이 될 수 있도록 남겨두고 있습니다. (. 개정 된 질문을 반영하기 위해 수정 됨)

관련 문제