Hitung nilai nol dan bukan nol dalam kolom

10

Bagaimana cara menghitung dan mengambil nol dan bukan nol pada kolom yang sama di MySQL?

meja saya

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

Hasil yang diharapkan

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

Jawaban:

6

Mencoba

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');

Tidak perlu membuat kolom lain.

Rodrigo Prazim
sumber
2

Hal pertama yang harus dilakukan adalah menambahkan kolom pada bulan ini:

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

Maka Anda bisa mendapatkan semua penghitungan:

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
Yawar
sumber
Anda dapat menggunakan count bukan sum dan memperpendek ekspresi sedikit: count(visited). count (<column>) hanya akan dihitung bukan null. Jika Anda menambahkan level lain dari nesting count_not_visited dapat ditentukan sebagaicount_registered - count_visited
Lennart
1

Untuk menghitung semua nilai bukan nol untuk sebuah kolom, katakanlah col1, Anda hanya dapat menggunakan count(col1) as cnt_col1. Tetapi, agar lebih jelas, Anda dapat menggunakan sum()fungsi dan IS NOT NULLoperator, menjadi sum(col1 IS NOT NULL). Itu karena IS NOT NULLoperator mengembalikan int: 1 untuk true dan 0 untuk false.

Untuk menghitung nilai nol, Anda dapat menggunakan IS NULLoperator, yang mengembalikan 1 saat nilai nol. Seperti sebelumnya, dengan sum()operator.

Mengingat bahwa, untuk mendapatkan pendaftaran, kunjungan dan tidak dikunjungi setiap bulan, inilah yang dapat Anda lakukan:

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')

Perhatikan bahwa Anda bisa menampilkan kolom 'tidak dikunjungi' dengan spasi, hanya dengan mengutip, mengutip ganda atau menggunakan backticks (`).

Pendekatan lain untuk memilih dan mengelompokkan berdasarkan bulan adalah dengan menggabungkan bulan dengan tahun, seperti ini concat(month(registDate), '-', date(registDate)). Tapi itu kurang elegan.

The caseOperator diusulkan dalam tanggapan lain adalah hal yang sah, tapi saya pikir itu lebih memadai untuk situasi lainnya. Dan itu lebih bertele-tele.

Nuno Pereira
sumber