it-swarm.com.de

SQL: Count () basierend auf dem Spaltenwert

Ich habe eine Tabelle wie folgt:

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

Ich möchte ein SQL-Skript erstellen, das die Anzahl der Verkaufsergebnisse und die Anzahl aller anderen Versuche (alles <> 36) zählt, etwa:

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

Gibt es eine Möglichkeit, ein COUNT () zu erstellen, das eine Bedingung wie COUNT (CallID WHERE OutcomeID = 36) enthält?

19
BrianKE

Sie können einen CASE-Ausdruck mit Ihrem Aggregat verwenden, um eine Summe basierend auf dem outcomeId -Wert zu erhalten:

select companyId,
  sum(case when outcomeid = 36 then 1 else 0 end) SalesCount,
  sum(case when outcomeid <> 36 then 1 else 0 end) NonSalesCount
from yourtable
group by companyId;

Siehe SQL Fiddle mit Demo

64
Taryn

Etwas wie das:

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

sollte funktionieren - COUNT() zählt nur keine Nullwerte.

3

Ja. Count zählt keine NULL-Werte, daher können Sie dies tun:

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

Alternativ können Sie SUM verwenden, wie in bluefeet gezeigt.

2
GolezTrol
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;

Verwenden dieses sich gegenseitig ausschließenden Musters mit COUNT(*)

  • vermeidet einen (sehr kleinen) Aufwand beim Auswerten einer zweiten bedingten COUNT
  • gibt korrekte Werte an, wenn outcomeid NULL sein kann

Verwenden von @ bluefeets SQLFiddle mit hinzugefügten NULL-Werten

2
gbn