2013-11-28 3 views
2

Myself знакомство с sqlalchemy.I имеют MySQL запрос, как показано ниже:MySQL запросов к SQLAlchemy версии

SELECT COUNT(*) AS total, SUM(IF(sub = 'N', 1, 0)) AS NotSubscribed, SUM(IF(subscription = 'A', 1, 0)) AS 12Month, SUM(IF(subscription = 'HY', 1, 0)) AS 6Month, SUM(IF(subscription = 'M', 1, 0)) AS 1Month 
FROM accounts 
WHERE userID IS NOT NULL 

Я пытаюсь написать версию SQLAlchemy этого.

users = Table('users',metadata,autoload=True) 
    userInfo = users.select([func.count(users.c.userID).label('Total'), 
           func.sum(users.c.sub == 'N').label('NotSubscribed'), 
           func.sum(users.c.sub == 'A').label('12Month'), 
           func.sum(users.c.sub =='HY').label('6Month'), 
           func.sum(users.c.sub == 'M').label('1Month')]).where(users.c.userID != None).execute() 

Я кончаю с следующей ошибкой:

sqlalchemy.exc.ArgumentError: SQL expression object or string expected 

Может кто-то помочь мне, где я неправильно. Если не сообщите мне, есть ли какие-либо хорошие руководства по sqlalchemy, кроме документации.

Благодаря

+0

Что такое 'SUM (IF (..., 1, 0))' предполагается делать здесь? Общее количество для разных типов подписки? –

+0

hi, bascially я пытаюсь получить общее количество пользователей от разных пользователей, подписавшихся на них. Я хочу удалить – troy

+2

Почему бы просто не использовать 'SELECT-подписку, COUNT (userID) FROM учетных записей WHERE userID IS NOT NULL GROUPBY subscription' и сделать' total' сумма результирующих строк? Этот запрос будет намного легче на сервере запросов. –

ответ

1

sum проблема в вашем коде. Чтобы это сработало, вам нужно будет объединить sum и case. Ниже показаны 2 способа использования case (выбрать один вам больше нравится):

qry = select([ 
     func.count(users.c.userID).label("Total"), 
     func.sum(case(value=users.c.sub, whens={'N': 1}, else_=0)).label("NotSubscribed"), 
     func.sum(case(value=users.c.sub, whens={'A': 1}, else_=0)).label("12Month"), 
     func.sum(case([(users.c.sub == 'HY', 1)], else_=0)).label("6Month"), 
     func.sum(case([(users.c.sub == 'M', 1)], else_=0)).label("1Month"), 
    ], 
).where(users.c.userID != None) 

res = engine.execute(qry) 
print res.keys()  # column names 
print res.fetchone() # values 

Однако, я бы действительно рассмотреть рекомендацию Martijn, соответствующее выражение SA, для которых было бы:

qry = select([users.c.sub, func.count(users.c.userID)]).where(users.c.userID != None).group_by(users.c.sub) 

res = engine.execute(qry) 
rows = res.fetchall() 
rows.append(('Total', sum(_r[1] for _r in rows))) # add Total 
for row in rows: 
    print row 
+0

спасибо mate, сладкий и простой;) – troy

Смежные вопросы