如何在mysql查询中显示count zero

yuvru6vn  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(320)

我想知道某个月加入的员工人数。下面是我的样本数据。

如果一个月内没有员工加入,则查询应显示零,

我想出了这样的办法,但这只显示了在某个特定月份有一个参与者的月份,

  1. SELECT
  2. COUNT(*) AS count,
  3. CASE
  4. WHEN MONTH(startDate) = 1 THEN 'JAN'
  5. WHEN MONTH(startDate) = 2 THEN 'FEB'
  6. WHEN MONTH(startDate) = 3 THEN 'MAR'
  7. WHEN MONTH(startDate) = 4 THEN 'APR'
  8. WHEN MONTH(startDate) = 5 THEN 'MAY'
  9. WHEN MONTH(startDate) = 6 THEN 'JUN'
  10. WHEN MONTH(startDate) = 7 THEN 'JUL'
  11. WHEN MONTH(startDate) = 8 THEN 'AUG'
  12. WHEN MONTH(startDate) = 9 THEN 'SEP'
  13. WHEN MONTH(startDate) = 10 THEN 'OCT'
  14. WHEN MONTH(startDate) = 11 THEN 'NOV'
  15. WHEN MONTH(startDate) = 12 THEN 'DEC'
  16. END AS SMonth
  17. FROM
  18. Reports
  19. GROUP BY SMonth

我正在使用mysql。
编辑
报告表中有跨越不同年份的数据,例如198820122015年的数据等,因此可能有2015年1月的joinee数据,但没有2018年1月的数据

8ulbf1ek

8ulbf1ek1#

您可以使用月份序列和mananeg作为空值

  1. SELECT
  2. sum(case when startDate is null then 0 else 1 end) AS count,
  3. CASE
  4. WHEN t.mon_num = 1 THEN 'JAN'
  5. WHEN t.mon_num = 2 THEN 'FEB'
  6. WHEN t.mon_num = 3 THEN 'MAR'
  7. WHEN t.mon_num = 4 THEN 'APR'
  8. WHEN t.mon_num = 5 THEN 'MAY'
  9. WHEN t.mon_num = 6 THEN 'JUN'
  10. WHEN t.mon_num = 7 THEN 'JUL'
  11. WHEN t.mon_num = 8 THEN 'AUG'
  12. WHEN t.mon_num = 9 THEN 'SEP'
  13. WHEN t.mon_num = 10 THEN 'OCT'
  14. WHEN t.mon_num = 11 THEN 'NOV'
  15. WHEN t.mon_num = 12 THEN 'DEC'
  16. END AS SMonth
  17. FROM (
  18. select 1 mon_num
  19. union
  20. select 2
  21. union
  22. select 3
  23. union
  24. select 4
  25. union
  26. select 5
  27. union
  28. select 6
  29. union
  30. select 7
  31. union
  32. select 8
  33. union
  34. select 9
  35. union
  36. select 10
  37. union
  38. select 11
  39. union
  40. select 12
  41. ) t
  42. LEFT JOIN Reports ON t.mon_num = MONTH(startDate)
  43. GROUP BY SMonth
展开查看全部
ct2axkht

ct2axkht2#

像这样的东西也许合适。但是你也可以从date函数中得到month。

  1. SELECT
  2. date_table.dt,
  3. MONTHNAME(date_table.dt) SMonth,
  4. COUNT(r.startDate) AS count
  5. FROM
  6. (
  7. SELECT
  8. DATE(CONCAT(1970 + y1.num + y2.num*10, "-", mnth.num, "-01")) dt
  9. FROM
  10. (SELECT 1 num UNION ALL SELECT 2 num UNION ALL SELECT 3 num UNION ALL SELECT 4 num UNION ALL SELECT 5 num UNION ALL SELECT 6 num UNION ALL SELECT 7 num UNION ALL SELECT 8 num UNION ALL SELECT 9 num UNION ALL SELECT 10 num) y1
  11. CROSS JOIN
  12. (SELECT 1 num UNION ALL SELECT 2 num UNION ALL SELECT 3 num UNION ALL SELECT 4 num UNION ALL SELECT 5 num UNION ALL SELECT 6 num UNION ALL SELECT 7 num UNION ALL SELECT 8 num UNION ALL SELECT 9 num UNION ALL SELECT 10 num) y2
  13. CROSS JOIN
  14. (SELECT 1 num UNION ALL SELECT 2 num UNION ALL SELECT 3 num UNION ALL SELECT 4 num UNION ALL SELECT 5 num UNION ALL SELECT 6 num UNION ALL SELECT 7 num UNION ALL SELECT 8 num UNION ALL SELECT 9 num UNION ALL SELECT 10 num UNION ALL SELECT 11 num UNION ALL SELECT 12 num) mnth
  15. ) date_table
  16. LEFT JOIN
  17. Reports r on FORMAT_DATE(r.startDate, "%Y-%m-01") = date_table.dt
  18. WHERE
  19. date_table.dt BETWEEN "1991-07-24" AND NOW()
  20. GROUP BY
  21. date_table.dt
  22. ORDER BY
  23. date_table.dt
  24. ;
展开查看全部
7cwmlq89

7cwmlq893#

这种方法也很有效,你应该有最新版本的mysql。

  1. with recursive cte (n) as (
  2. select '2012-01-01'
  3. union all
  4. select n+interval 1 month
  5. from cte
  6. where n < '2012-12-01'
  7. ) select count(emp.empno) as total,date_format(cte.n,'%M') as Month
  8. from cte left join emp
  9. on date_format(cte.n,'%M') = date_format(emp.hiredate,'%M')
  10. group by cte.n ;
eulz3vhy

eulz3vhy4#

你可以用 coalesce(count(*), 0) 或者 ifnull(count(*), 0) 在您的查询中。

  1. SELECT
  2. coalesce(COUNT(*), 0) AS count,
  3. CASE
  4. WHEN MONTH(startDate) = 1 THEN 'JAN'
  5. WHEN MONTH(startDate) = 2 THEN 'FEB'
  6. WHEN MONTH(startDate) = 3 THEN 'MAR'
  7. WHEN MONTH(startDate) = 4 THEN 'APR'
  8. WHEN MONTH(startDate) = 5 THEN 'MAY'
  9. WHEN MONTH(startDate) = 6 THEN 'JUN'
  10. WHEN MONTH(startDate) = 7 THEN 'JUL'
  11. WHEN MONTH(startDate) = 8 THEN 'AUG'
  12. WHEN MONTH(startDate) = 9 THEN 'SEP'
  13. WHEN MONTH(startDate) = 10 THEN 'OCT'
  14. WHEN MONTH(startDate) = 11 THEN 'NOV'
  15. WHEN MONTH(startDate) = 12 THEN 'DEC'
  16. END AS SMonth
  17. FROM
  18. Reports
  19. GROUP BY SMonth
展开查看全部

相关问题