2012-11-27 87 views
1

我查询如何在此查询中包含等于0的计数?

select state,count(*) from crm_lead group by state; 

其返回

state count 
done 794 
open 560 
pending 3 
draft 8 
cancel 1 

但有时当我有没有 '取消' 的任务在我的表

state count 
done 794 
open 560 
pending 4 
draft 8 

我想包括在计数= 0结果,什么是最好的查询?

+1

您是否有另一张包含所有州名的表? –

回答

4
SELECT a.STATE , 
     COALESCE(b.count, 0) AS Count 
FROM 
    (
     SELECT 'done' AS STATE 
     UNION 
     SELECT 'open' AS STATE 
     UNION 
     SELECT 'pending' AS STATE 
     UNION 
     SELECT 'draft' AS STATE 
     UNION 
     SELECT 'cancel' AS STATE 
    ) a LEFT JOIN 
    (
     SELECT STATE , 
       count(*) AS count 
     FROM crm_lead 
     GROUP BY STATE 
    ) b ON a.STATE = b.STATE 
+0

'+ 1'为此.. –

+0

要从行中形成一个集合而不需要重复使用'UNION ALL'。虽然只有五行并不重要。 –

+1

多好的查询,谢谢帅哥。 –

1

你也可以做到这一点,如果你只是想确保取消是在列表中:

select coalesce(t.state, const.state) as state, coalesce(t.cnt, const.cnt) as cnt 
from (select state, count(*) as cnt 
     from crm_lead 
     group by state 
    ) t full outer join 
    (select 'cancel' as state, 0 as cnt 
    ) const 
    on t.state = const.state 

如果国家的名单很长,这可能是很方便,或者如果你只是想以确保包含一个特定的值。

1

简单与VALUES表达式:

SELECT a.state, COALESCE(b.ct, 0) AS ct 
FROM (VALUES('done'), ('open'), ('pending'), ('draft'), ('cancel')) a (state) 
LEFT JOIN (
    SELECT state, count(*) AS ct 
    FROM crm_lead 
    GROUP BY state 
) b USING (state); 
0
$jsonb = array(); 
foreach($em as $k => $v) { 
    $q = " 
     SELECT a.STATE , 
     COALESCE(b.count, 0) AS Count 
    FROM 
    (
     SELECT 'done' AS STATE 
     UNION 
     SELECT 'open' AS STATE 
     UNION 
     SELECT 'pending' AS STATE 
     UNION 
     SELECT 'draft' AS STATE 
     UNION 
     SELECT 'cancel' AS STATE 
    ) a LEFT JOIN 
    (
     SELECT STATE , 
       count(*) AS count 
     FROM crm_lead 
     WHERE (create_date, create_date) OVERLAPS ('2012-{$nn}-01'::DATE, '2012-{$nn}-{$num}'::DATE) 
     GROUP BY STATE 
    ) b ON a.STATE = b.STATE 
     "; 
     $result = retrieve($q); 

     $jsona = array(); 
     $values = array(); 
     $ev = array(); 
     foreach($result as $key => $val) { 
      $ev[] = $val['count']; 
     } 

    $jsonb[] = array("label" => $v,"values" =>$ev); 
} 

$jsona[] = array("label" => array(done,open,pending,draft,cancel),"values" => $jsonb); 

这是一个完成码去构造要返回给JavaScript JSON对象。 ps。这段代码包含了一些不重要的自定义函数,你可以猜测它们的值。