2017-05-08 53 views
0

我有以下查询,以获得每月访问次数:查询数据库获得有条件每月数

SELECT RTRIM(TO_CHAR(DATE_TRUNC('month', started_at), 'Month YYYY')) AS month, COUNT(id)::int 
FROM visits 
GROUP BY DATE_TRUNC('month', started_at) 
ORDER BY DATE_TRUNC('month', started_at); 

导致:

[ 
    {"month"=>"March  2017", "count"=>8}, 
    {"month"=>"April  2017", "count"=>21}, 
    {"month"=>"May  2017", "count"=>5} 
] 

我怎样才能改变/改善我的查询来获取从另一个表(users)的email列中是否包含某个域来拆分计数?

所以它会是这样的:

[ 
    {"month"=>"March  2017", "with_domain_count"=>4, "withoout_domain_count"=>4}, 
    {"month"=>"April  2017", "with_domain_count"=>11, "withoout_domain_count"=>10}, 
    {"month"=>"May  2017", "with_domain_count"=>4, "withoout_domain_count"=>1} 
] 

visits.user_id外键。域名是foo

回答

1

假设你可以加入表:

SELECT RTRIM(TO_CHAR(DATE_TRUNC('month', v.started_at), 'Month YYYY')) AS month, 
     COUNT(id)::int, 
     SUM((v.email like '%@gmail.com')::int) as withDomain, 
     SUM((v.email not like '%@gmail.com')::int) as withoutDomain 
FROM visits v LEFT JOIN 
    users u 
    ON v.userid = v.userId 
GROUP BY DATE_TRUNC('month', v.started_at) 
ORDER BY DATE_TRUNC('month', v.started_at); 
1

您可以通过使用case做有条件聚集内count功能检查一定的标准:

select RTRIM(TO_CHAR(DATE_TRUNC('month', v.started_at), 'Month YYYY')) as month, 
    COUNT(case 
      when u.email like '%@somedomain.com' 
       then id 
      end) as with_domain_count, 
    COUNT(case 
      when u.email not like '%@somedomain.com' 
       then id 
      end) as without_domain_count 
from visits v 
join users u on u.id = v.user_id 
group by DATE_TRUNC('month', v.started_at) 
order by DATE_TRUNC('month', v.started_at); 
+0

我敢肯定加盟需要执行,因为'email'列在'users'表中,而不在'visits'表中 –

+0

@AndreyDeineko - 是的,你可以加入表格然后找到聚集。更新了答案。 – GurV