2012-03-05 49 views
20

Tôi đang cố gắng để tinh chỉnh một truy vấn mà tôi hiện đang sử dụng:MySQL - COUNT Conditional với GROUP BY

SELECT `puid`, 
     COUNT(DISTINCT `droid_v`) AS DROID, 
     COUNT(DISTINCT `sig_v`) AS sig, 
     SUM(NoExt) AS hits 
     FROM temp 
     GROUP BY `puid` 

Và tôi cần phải làm cho nó chỉ đếm droid_v nơi droid_V lớn hơn 0. Có có thể điều kiện đếm theo cách này? Hiện tại, nó đang đếm các giá trị bằng 0 là có thể đếm được và tôi không thể thực sự thay đổi số 0 thành giá trị null.

Tôi không cần biết giá trị đếm cho droid_V = 0, tôi chỉ cần đếm nó nếu số đó lớn hơn 0. Số đó sẽ luôn là 0, 1, 2, 3 hoặc 4.


tôi đã thử:

SELECT `puid`, 
    COUNT(DISTINCT CASE WHEN `droid_v` > 0 THEN 1 END) AS DROID, 
    COUNT(DISTINCT `sig_v`) AS sig, 
    SUM(`NoExt`) AS hits 
    FROM temp 
    GROUP BY `puid` 

Nhưng điều này mang lại một kết quả nhị phân (0 hoặc 1) không phải là số tôi mong đợi.

dụ output =

puid   DROID sig  hits 
No PUID   1  1  252 
x-fmt/92  1  5  1008 

đầu ra dự đoán:

puid   DROID sig  hits 
No PUID   1  1  252 
x-fmt/92  3  5  1008 

dữ liệu mẫu:

id;puid;droid_v;sig_v;speed;Ext;NoExt;tally 


1;"No PUID";"3";"v13";"SLOW";"0";"63";"63" 
2;"x-fmt/92";"3";"v13";"SLOW";"63";"0";"63" 
3;"x-fmt/92";"3";"v37";"SLOW";"63";"63";"126" 
4;"x-fmt/92";"3";"v45";"SLOW";"63";"63";"126" 
5;"x-fmt/92";"3";"v49";"SLOW";"63";"63";"126" 
6;"x-fmt/92";"3";"v50";"SLOW";"63";"63";"126" 
7;"x-fmt/92";"5";"v13";"SLOW";"63";"0";"63" 
8;"No PUID";"5";"v13";"SLOW";"0";"63";"63" 
9;"x-fmt/92";"5";"v37";"SLOW";"63";"63";"126" 
10;"x-fmt/92";"5";"v45";"SLOW";"63";"63";"126" 
11;"x-fmt/92";"5";"v49";"SLOW";"63";"63";"126" 
12;"x-fmt/92";"5";"v50";"SLOW";"63";"63";"126" 
13;"No PUID";"6";"v13";"FAST";"0";"63";"63" 
14;"x-fmt/92";"6";"v13";"SLOW";"63";"0";"63" 
15;"No PUID";"6";"v13";"SLOW";"0";"63";"63" 
16;"x-fmt/92";"6";"v13";"FAST";"63";"0";"63" 
17;"x-fmt/92";"6";"v37";"SLOW";"63";"63";"126" 
18;"x-fmt/92";"6";"v37";"FAST";"63";"63";"126" 
19;"x-fmt/92";"6";"v45";"FAST";"63";"63";"126" 
20;"x-fmt/92";"6";"v45";"SLOW";"63";"63";"126" 
21;"x-fmt/92";"6";"v49";"FAST";"63";"63";"126" 
22;"x-fmt/92";"6";"v49";"SLOW";"63";"63";"126" 
23;"x-fmt/92";"6";"v50";"FAST";"63";"63";"126" 
24;"x-fmt/92";"6";"v50";"SLOW";"63";"63";"126" 
+0

bạn có thể thêm mệnh đề 'WHERE' không? –

+0

từ ví dụ bạn đã cung cấp, kết quả mong đợi của bạn là gì? –

Trả lời

26

Nếu droid_v chỉ có thể là 0, 1, 2, 3 hoặc 4, thì COUNT (DISTINCT) sẽ không bao giờ trở lại quá 5, vì chỉ có năm giá trị có thể. Đó là điều bạn muốn? Nếu vậy, sau đó thử này:

SELECT puid, COUNT(DISTINCT CASE WHEN droid_v > 0 THEN droid_v ELSE 0 END) - 1 AS droid /* -1 for the case where droid_v is 0 */ 
    , COUNT(DISTINCT sig_v) AS sig 
    , SUM(NoExt) AS hits 

Cập nhật: Rất tiếc, xin lỗi, phía trên là không hoàn toàn đúng vì có thể không được một số không. Nó nên là:

SELECT puid, COUNT(DISTINCT CASE WHEN droid_v > 0 THEN droid_v END) AS droid 

Nếu, mặt khác, bạn muốn có một số của tất cả các hàng nơi droid_v> 0, sau đó tôi nghĩ rằng bạn muốn điều này:

SELECT puid, SUM(CASE WHEN droid_v > 0 THEN 1 ELSE 0 END) AS droid 
    , COUNT(DISTINCT sig_v) AS sig 
    , SUM(NoExt) AS hits 

Hope this helps.

+0

Thats một - Tôi đã poking đi vào nó trước khi thay đổi của bạn, và cố gắng tìm ra những gì đã sai. Bạn là chính xác, nó di chuyển không phải là Zero. Cảm ơn vì đã dành thời gian cho tôi. – Jay

7
SELECT 
    `puid`, 
    COUNT(DISTINCT CASE WHEN `droid_v` > 0 THEN `droid_v` END) AS DROID, 
    COUNT(DISTINCT `sig_v`) AS sig, 
    SUM(NoExt) AS hits 
+0

Xin chào, cảm ơn vì đề xuất này, tôi đã chỉnh sửa câu hỏi để trả lời ý tưởng của bạn. – Jay

+0

Câu trả lời ban đầu của tôi là sai mặc dù câu hỏi rõ ràng của bạn. Xem câu trả lời đã sửa đổi. –

+0

Điều đó hoạt động như mong đợi. Cảm ơn bạn đã sửa đổi. – Jay

1

thêm video này vào truy vấn

WHERE droid_v > 0 
+0

Cảm ơn bạn đã xem - nhưng điều đó thực sự không hiệu quả. – Jay

3

Đây là giải pháp đơn giản nhất tôi có thể nghĩ:

SELECT puid, 
SUM(droid_v > 0) AS DROID, 
COUNT(DISTINCT sig_v) AS sig, 
SUM(`NoExt`) AS hits 
FROM t 
GROUP BY puid 

Tuy nhiên, nó không phải là rõ ràng nếu bạn muốn đếm riêng biệt hay không.Nếu bạn muốn đếm các giá trị khác biệt thì:

SELECT puid, 
COUNT(if(droid_v > 0, droid_v, null)) AS DROID, 
COUNT(DISTINCT sig_v) AS sig, 
SUM(`NoExt`) AS hits 
FROM t 
GROUP BY puid 
+0

Cảm ơn bạn đã có một cái nhìn - đó là gần, nhưng nó mất chức năng riêng biệt mà tôi cần (xin lỗi nếu tôi đã không làm cho rõ ràng) – Jay

5

Chỉ cần sử dụng một khoản tiền

vì vậy nếu bạn muốn nhóm một cái gì đó check this out

select city, sum(case when gender = 'male' then 1 else 0 end) as male, 
sum(case when gender = 'female' then 1 else 0 end) as female 
from person 
group by city 

đơn giản như thế này: D