1

私の質問

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を含めたいのですが、最適なクエリは何ですか?

4

4 に答える 4

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
于 2012-11-27T02:29:04.967 に答える
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つだけ含まれていることを確認したい場合に便利です。

于 2012-11-27T02:53:47.437 に答える
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);
于 2012-11-27T02:57:12.150 に答える
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。このコードには、重要ではないいくつかのカスタム関数が含まれていました。それらの値を推測できます。

于 2012-11-27T05:25:08.473 に答える