2009-12-14 2 views
1

У меня есть таблица с именем users с столбцом activated_at, и я хочу подсчитать, сколько пользователей было активировано, проверяя, является ли столбец нулевым или нет. А затем отображать их бок о бок, как это:Как реорганизовать этот SQL-запрос?

+----------+-----------+---------------+-------+ 
| Malaysia | Activated | Not Activated | Total | 
+----------+-----------+---------------+-------+ 
| Malaysia |  5487 |   303 | 5790 | 
+----------+-----------+---------------+-------+ 

Так что это мой SQL:

select "Malaysia", 
    (select count(*) from users where activated_at is not null and locale='en' and date_format(created_at,'%m')=date_format(now(),'%m')) as "Activated", 
    (select count(*) from users where activated_at is null and locale='en' and date_format(created_at,'%m')=date_format(now(),'%m')) as "Not Activated", 
    count(*) as "Total" 
    from users 
    where locale="en" 
    and date_format(created_at,'%m')=date_format(now(),'%m'); 

В моем коде, я должен указать все заявления, где три раза, что, очевидно, излишним. Как я могу реорганизовать это?

С уважением, MK.

ответ

6

Не уверен, что если MySql поддерживает конструкцию CASE, но я обычно имеют дело с этим типом вопроса, делая что-то вроде,

select "Malaysia", 
    SUM(CASE WHEN activated_at is not null THEN 1 ELSE 0 END) as "Activated", 
    SUM(CASE WHEN activated_at is null THEN 1 ELSE 0 END as "Not Activated", 
    count(*) as "Total" 
from users 
where locale="en" and date_format(created_at,'%m')=date_format(now(),'%m'); 
+0

Я собирался сказать это, но проверял мои ссылки. :) – GrayWizardx

+0

См. для получения более подробной информации об использовании CASE ... КОГДА с MySQL. –

+0

MySQL принуждает TRUE к 1, так что вы можете просто сделать это, например. SUM (activate_at IS NOT NULL), не требуется CASE. –

0
SELECT 
    COUNT(CASE WHEN activated_at IS NOT NULL THEN 1 ELSE 0 END) as "Activated", 
    COUNT(CASE WHEN activated_at IS NULL THEN 1 ELSE 0 END) as "Not Activated", 
    COUNT(*) as "Total" 
FROM users WHERE locale="en" AND date_trunc('month', now()) = date_trunc('month' ,created_at); 
+0

Это диалект postgresql. Возможно, вам придется использовать IF THEN ELSE END в mysql. –

+0

@Nick: CASE поддерживается MySQL –

0

Я думаю, что это будет работать .. непроверенных хотя:

select "Malaysia", 
    (select count(*) from users2 where activated_at is not null) as "Activated", 
    (select count(*) from users2 where activated_at is null) as "Not Activated", 
    count(*) as "Total" 
    from (select * from users where locale='en' and date_format(created_at,'%m')=date_format(now(),'%m')) users2 

p/s: рад видеть другого малазийского здесь;)

EDIT: это не сработает .. извините .. используйте C ASE WHEN, как было предложено другими. Я бы хотел удалить этот ответ.