Đếm giá trị null và không null trong một cột


10

Làm cách nào để đếm và truy xuất null và không null trên cùng một cột trong MySQL?

khả năng của tôi

---------------------------------------------------
id   |    name    |      visited   |   registDate |
---------------------------------------------------
1    |    george  |       NULL     |   2014-04-01 |
---------------------------------------------------
2    |    Thomas  |       NULL     |   2014-04-15 |
---------------------------------------------------
3    |    Wilfred |        1       |   2014-04-24 |
---------------------------------------------------
4    |    paul    |        1       |   2014-04-10 |
---------------------------------------------------
5    |    elina   |       NULL     |   2014-05-03 |
---------------------------------------------------
6    |    angela  |       NULL     |   2014-04-13 |
---------------------------------------------------
7    |    elina   |        1       |   2014-05-18 |
---------------------------------------------------

Kết quả mong đợi

month      register    visited    not visited
---------------------------------------------
05-2014       2           1          1   
---------------------------------------------
04-2014       5           2          3
---------------------------------------------

Câu trả lời:


6

Thử

SELECT 
   DATE_FORMAT(registDate, '%m-%Y') AS month,
   COUNT(name) AS register,
   SUM(!ISNULL(visited)) AS visited,
   SUM(ISNULL(visited)) AS not_visited
FROM mytable
GROUP BY DATE_FORMAT(registDate, '%m-%Y');

Không cần phải tạo một cột khác.


2

Điều đầu tiên cần làm là 'thêm vào' một cột trong tháng:

select *, date_format(registDate, '%Y-%m') as regist_month
from mytable

Sau đó, bạn có thể nhận được tất cả các tính:

select
  regist_month
, count(registDate) as count_registered
, sum(case when visited is not null then 1 else 0 end) as count_visited
, sum(case when visited is null then 1 else 0 end) as count_not_visited
from (
  select *, date_format(registDate, '%Y-%m') as regist_month
  from mytable
) group by regist_month

Bạn có thể sử dụng đếm thay vì tổng và rút ngắn biểu thức một chút : count(visited). đếm (<cột>) sẽ chỉ tính không null. Nếu bạn thêm một mức lồng nhau khác, Count_not_visited có thể được xác định làcount_registered - count_visited
Lennart

1

Để đếm tất cả các giá trị không null cho một cột, giả sử col1, bạn chỉ có thể sử dụng count(col1) as cnt_col1. Nhưng, để rõ ràng hơn, bạn có thể sử dụng sum()hàm và IS NOT NULLtoán tử, trở thành sum(col1 IS NOT NULL). Đó là bởi vì IS NOT NULLtoán tử trả về một int: 1 cho true và 0 cho false.

Để đếm giá trị null, bạn có thể sử dụng IS NULLtoán tử, trả về 1 khi giá trị null. Giống như trước đây, với các sum()nhà điều hành.

Cho rằng, để có được đăng ký, truy cập và không truy cập mỗi tháng, đây là những gì bạn có thể làm:

SELECT
date_format(registDate, '%m-%Y') as month,
count(registDate) as register,
sum(visited is not null) as visited,
sum(visited is null) as 'not visited'
GROUP BY
date_format(registDate, '%m-%Y')

Lưu ý rằng bạn có thể xuất cột 'không truy cập' với khoảng trắng, chỉ bằng cách trích dẫn, trích dẫn kép hoặc sử dụng backticks (`).

Một cách tiếp cận khác để chọn và nhóm theo tháng sẽ là nối tháng với năm, như thế này concat(month(registDate), '-', date(registDate)). Nhưng nó kém thanh lịch.

Các casenhà điều hành đưa ra trong câu trả lời khác là hoàn toàn hợp lệ, nhưng tôi nghĩ rằng nó thích hợp hơn đối với các tình huống khác. Và nó dài dòng hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.