【问题标题】:How to include count equal to 0 on this query?如何在此查询中包含等于 0 的计数?
【发布时间】:2012-11-27 13:25:08
【问题描述】:

我的查询

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

我想在结果中包含 count = 0,最好的查询是什么?

【问题讨论】:

  • 你有另一个包含所有州名的表吗?

标签: sql postgresql postgresql-9.1


【解决方案1】:
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

【讨论】:

  • 从行组成一个集合而不介意重复使用UNION ALL。不过,只有五行并不重要。
【解决方案2】:

如果您只想确保取消在列表中,您也可以这样做:

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

如果状态列表很长,或者您只想确保包含一个特定值,这可能会很方便。

【讨论】:

    【解决方案3】:

    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);
    

    【讨论】:

      【解决方案4】:
      $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 对象。 附言。这段代码包含了一些不重要的自定义函数,你可能会猜到它们的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-11
        • 2021-01-04
        • 2014-08-09
        • 2021-11-11
        • 1970-01-01
        • 2019-08-05
        • 2021-11-27
        • 1970-01-01
        相关资源
        最近更新 更多