2013-06-19 9 views
15

Mam następująco tabelę:SQL: Hrabia() na podstawie wartości kolumny

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

Chciałbym utworzyć skrypt SQL, który zlicza liczbę wyników sprzedaży i liczby wszystkich pozostałych prób (cokolwiek <> 36), coś jak:

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

Czy istnieje sposób, aby zrobić count(), która zawiera warunek jak Count (CallID GDZIE OutcomeID = 36)?

Odpowiedz

53

Można użyć wyrażenia CASE z kruszywem, aby uzyskać łącznie na podstawie wartości 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; 

Zobacz SQL Fiddle with Demo

+0

świetnie, dziękuję – BrianKE

+0

@BrianKE: Czy 'wynikid' może być NULL? – gbn

+0

dziękuję bardzo dziękuję Sir !!!!! –

1

Tak. Liczba nie zawiera wartości NULL, więc możesz to zrobić:

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 

Alternatywnie, możesz użyć SUM, jak wykazano bluefeet.

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; 

Stosując ten wyłączny wzorca COUNT(*)

  • unika (bardzo mały) narzut oceny drugiego warunkowego COUNT
  • daje poprawne wartości, jeśli outcomeid może być NULL

Korzystanie z @ bluefeet's SQLFiddle z dodanymi wartościami NULL

3

coś takiego:

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 

powinny działać - nie tylko liczy COUNT() wartości null.