Я выполняю этот запрос
SELECT Kd_penyakit, Penyakit,
COUNT(case when Kd_gejala in ('G01','','G03','G04','','','','','','','','','','','','','','','','','','')then 1 else null end) / COUNT(kd_penyakit)*100 AS cases
FROM tbl_casebase
GROUP BY Kd_penyakit
ORDER BY cases DESC
и результат подобен этому
Kd_penyakit Penyakit cases
P01 Tipus Ayam 42.8571
P06 Produksi Telur 25.0000
P03 Salesma Ayam 14.2857
P02 Berak Darah 0.0000
P04 Gumboro 0.0000
P05 Mareks 0.0000
мой вопрос заключается в том, как исключить значения 0, чтобы результат был таким же
Kd_penyakit Penyakit cases
P01 Tipus Ayam 42.8571
P06 Produksi Telur 25.0000
P03 Salesma Ayam 14.2857
Отфильтруйте нежелательные строки перед агрегатами, используя exists
:
SELECT Kd_penyakit, Penyakit,
COUNT(case when Kd_gejala in ('G01','G03','G04','') then 1 end) / COUNT(kd_penyakit)*100 AS cases
FROM tbl_casebase
where exists (
select 1 from tbl_casebase t2
where tbl_casebase.Kd_penyakit = t2.Kd_penyakit
and t2.Kd_gejala in ('G01','G03','G04','')
)
GROUP BY Kd_penyakit
ORDER BY cases DESC
;
Заметьте, вы можете опустить "else null" при использовании выражения case с count()
Один из способов - отфильтровать его в предложении HAVING
, используя одно и то же выражение
SELECT ...
FROM ...
GROUP BY ...
HAVING COUNT(case when Kd_gejala in ('G01','','G03','G04','','','','','','','','','','','','','','','','','','')then 1 else null end) / COUNT(kd_penyakit)*100 > 0
ORDER BY ...
Поскольку вы используете mysql, его можно просто написать с помощью ALIAS
хотя это не стандартная практика и работает только в mysql, и когда расширение ONLY_FULL_GROUP_BY освобождено.
SELECT ...
FROM ...
GROUP BY ...
HAVING cases > 0
ORDER BY ...