3

DISTINCT条件付きステートメントと複数の値を使用して合計を収集する必要がありますGROUP BY。以下の例は、はるかに複雑なクエリの単純化されたバージョンです。

実際のクエリは非常に大きいため、クエリを大幅に書き直す必要はありません。

データ

Contracts
    id  advertiser_id   status
    1   1               1
    2   2               1
    3   3               2
    4   1               1

近いクエリ

SELECT
    COUNT( DISTINCT advertiser_id ) AS advertiser_qty,
    COUNT( DISTINCT id ) AS contract_qty,
    SUM( IF( status = 1, 1, 0 ) ) AS current_qty,
    SUM( IF( status = 2, 1, 0 ) ) AS expired_qty,
    SUM( IF( status = 3, 1, 0 ) ) AS other_qty
FROM (
        SELECT * FROM  `contracts`
        GROUP BY advertiser_id, id
) AS temp

現在返品中

advertiser_qty  contract_qty    current_qty     expired_qty     other_qty   
3               4               3               1               0

戻る必要があります

advertiser_qty  contract_qty    current_qty     expired_qty     other_qty   
3               4               2               1               0

current_qtyこれはstatus = 1for onlyを使用したレコードの合計でDISTINCT advertiser_idsあり、各合計関数には同じ修正が必要です。

誰かが関数にプラグインできる簡単なソリューションを持っていることを願っていSUMます。

-ありがとう!!

4

1 に答える 1

3

これを試して

    SELECT
    COUNT( DISTINCT advertiser_id ) AS advertiser_qty,
    COUNT( DISTINCT id ) AS contract_qty,
    (select count(distinct advertiser_id) from contracts where status =1 
    ) AS current_qty,

   SUM( IF( status = 2, 1, 0 ) ) AS expired_qty,
   SUM( IF( status = 3, 1, 0 ) ) AS other_qty
   FROM (
   SELECT * FROM  `contracts`
   GROUP BY advertiser_id, id
   ) AS temp

デモはこちら

編集:

副選択せずにこれを探すことができます。

 SELECT COUNT(DISTINCT advertiser_id) AS advertiser_qty,
        COUNT(DISTINCT id) AS contract_qty,
        COUNT(DISTINCT advertiser_id , status = 1) AS current_qty,
        SUM(IF(status = 2, 1, 0)) AS expired_qty,
        SUM(IF(status = 3, 1, 0)) AS other_qty
 FROM (SELECT *
       FROM   `contracts`
       GROUP BY advertiser_id, id) AS temp

デモはこちら

于 2013-03-13T20:04:55.740 に答える