28

次のようなテーブルがあります。

CallID   | CompanyID  | OutcomeID
----------------------------------
1234     | 3344       | 36
1235     | 3344       | 36
1236     | 3344       | 36
1237     | 3344       | 37
1238     | 3344       | 39
1239     | 6677       | 37
1240     | 6677       | 37

次のような、販売結果の数とその他すべての試行数 (<> 36) をカウントする SQL スクリプトを作成したいと思います。

CompanyID  | SalesCount  | NonSalesCount
------------------------------------------
3344       | 3           | 1
6677       | 0           | 2

COUNT(CallID WHERE OutcomeID = 36) のような条件を含む COUNT() を実行する方法はありますか?

4

5 に答える 5

5

このようなもの:

SELECT companyId,
  COUNT(CASE WHEN outcomeid = 36 THEN 1 END) SalesCount,
  COUNT(CASE WHEN outcomeid <> 36 THEN 1 END) NonSalesCount
FROM 
  yourtable
GROUP BY 
  companyId

動作するはずです -- COUNT()null 値ではなくカウントします。

于 2013-06-19T14:42:27.223 に答える
3

はい。Count は NULL 値をカウントしないため、次のようにすることができます。

select
  COUNT('x') as Everything,
  COUNT(case when OutcomeID = 36 then 'x' else NULL end) as Sales,
  COUNT(case when OutcomeID <> 36 then 'x' else NULL end) as Other
from
  YourTable

または、bluefeet が示すように、SUM を使用することもできます。

于 2013-06-19T14:41:11.607 に答える
2
SELECT
    companyId, SalesCount, TotalCount-SalesCount AS NonSalesCount
FROM
    (
    select
      companyId,
      COUNT(case when outcomeid = 36 then 1 else NULL end) SalesCount,
      COUNT(*) AS TotalCount
    from yourtable
    group by companyId
    ) X;

この相互に排他的なパターンを使用してCOUNT(*)

  • 2 番目の条件を評価する (非常に小さい) オーバーヘッドを回避するCOUNT
  • outcomeidNULLの場合は正しい値を返します

NULL を追加した@bluefeet のSQLFiddleの使用

于 2013-06-19T14:41:40.030 に答える