2013-06-19 16 views
15

Ho una tabella come segue:SQL: Count() in base al valore della colonna

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

vorrei creare uno script SQL che conta il numero di risultati di vendita e il numero di tutti gli altri tentativi (nulla <> 36), qualcosa come:

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

c'è un modo per fare un COUNT() che contiene una condizione come COUNT (CallID DOVE OutcomeID = 36)?

risposta

53

È possibile utilizzare un'espressione caso con il vostro aggregata per ottenere un totale in base al valore outcomeId:

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; 

Vedi SQL Fiddle with Demo

+0

eccellente, grazie – BrianKE

+0

@BrianKE: Can 'outcomeid' mai essere NULL? – gbn

+0

grazie molte grazie signore !!!!! –

1

Sì. Conte non conta i valori NULL, in modo da poter fare questo:

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 

In alternativa, è possibile utilizzare SUM, come bluefeet dimostrata.

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

Utilizzando questo modello mutuamente esclusivo con COUNT(*)

  • evita un (piccolo) aerea di valutare un secondo condizionale COUNT
  • dà valori corretti se outcomeid può essere NULL

Utilizzando @ bluefeet's SQLFiddle con valori NULL aggiunti

3

Qualcosa di simile a questo:

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 

dovrebbe funzionare - COUNT() solo non conta valori nulli.

Problemi correlati