2013-06-19 48 views
15

Tôi có một bảng như sau:SQL: Count() dựa trên giá trị cột

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

Tôi muốn tạo ra một kịch bản SQL mà đếm số lượng các kết quả bán hàng và số lượng của tất cả các nỗ lực khác (bất cứ điều gì <> 36), một cái gì đó như:

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

có cách nào để làm một COUNT() có chứa một điều kiện như COUNT (CallID ĐÂU OutcomeID = 36)?

Trả lời

53

Bạn có thể sử dụng một biểu thức CASE với tổng thể của bạn để có được một tổng dựa trên giá trị 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; 

Xem SQL Fiddle with Demo

+0

tuyệt vời, cảm ơn bạn – BrianKE

+0

@BrianKE: Có thể 'resultid' là NULL không? – gbn

+0

cảm ơn bạn cảm ơn rất nhiều Ngài !!!!! –

1

Yes. Số đếm không tính giá trị NULL, vì vậy bạn có thể thực hiện điều này:

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 

Hoặc, bạn có thể sử dụng SUM, như bảng màu xanh đã được minh họa.

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; 

Sử dụng mô hình loại trừ lẫn nhau này với COUNT(*)

  • tránh một (rất nhỏ) hất đánh giá một điều kiện thứ hai COUNT
  • cho giá trị đúng nếu outcomeid có thể NULL

Sử dụng @ bluefeet's SQLFiddle có thêm NULLs

3

Something như thế này:

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 

nên làm việc - COUNT() đếm chỉ không giá trị null.

Các vấn đề liên quan