2017-05-08 56 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