在MySQL中,如何将count(*)显示为0,而不是完全不显示行?

在MySQL中,如何将count(*)显示为0,而不是完全不显示行?,mysql,sql,select,Mysql,Sql,Select,因此,下面是对声明的分解,试图找到拥有技能的员工总数:p1、p2和认证的>10 SELECT name, COUNT(empNumber) FROM SKILL WHERE (certified > 10) AND name IN ('p1', 'p2') GROUP BY name; 在数据库中: P1有2名员工,P2有0名员工 但是,现在显示的是 name | count(empNumber) P1 | 2 P2 | 0 <= this

因此,下面是对声明的分解,试图找到拥有技能的员工总数:p1、p2和认证的>10

SELECT name, COUNT(empNumber) 
FROM SKILL 
WHERE (certified > 10) AND name IN ('p1', 'p2') 
GROUP BY name;
在数据库中: P1有2名员工,P2有0名员工

但是,现在显示的是

name | count(empNumber)
P1   |       2
P2   |       0   <= this row doesn't show but would like if it does
name |计数(编号)
P1 | 2

P2 | 0将
WHERE
逻辑移到计数中:

SELECT
    name,
    COUNT(CASE WHEN certified > 10 THEN empNumber END)
FROM SKILL 
WHERE name IN ('p1', 'p2') 
GROUP BY name;
WHERE
子句中对
certified
进行检查的问题在于,当发生
分组时,它会过滤掉不匹配的记录,然后才能对其进行计数。上面我的版本对所有记录进行聚合,然后使用条件聚合来获得匹配计数

您也可以在此处使用
SUM

SELECT
    name,
    SUM(CASE WHEN certified > 10 THEN 1 ELSE 0 END)
FROM SKILL
...
也许是这样

SELECT name, COUNT(empNumber) as empNum
FROM SKILL 
WHERE (certified > 10) AND name IN ('p1', 'p2') 
GROUP BY name
HAVING empNum > 0

祝您度过愉快的一天:)

您可以使用以下查询:

select name, count(certified)
from skill
where name in ('p1','p2')
      and certified > 10
group by name
union
select b.name, 0 
from
(
  select name, count(certified)
  from skill
  where name in ('p1','p2')
       and certified <=10
  group by name
) b;

MySQL具有方便的速记功能。根据您想要的结果,您可以表示为:

SELECT name, SUM(certified > 10) 
FROM SKILL 
WHERE name IN ('p1', 'p2') 
GROUP BY name;
这是计数技巧。要计算员工人数,我认为您需要:

SELECT name, COUNT(DISTINCT CASE WHEN certified > 10 THEN empnumber END) 
FROM SKILL 
WHERE name IN ('p1', 'p2') 
GROUP BY name;
如果
SKILL
中不存在这两个名称,并且您仍希望在结果集中看到它们,则需要
左连接(或某种联合):

请注意此查询的一些更改:

select name, count(certified)
from skill
where name in ('p1','p2')
      and certified > 10
group by name
union
select b.name, 0 
from
(
  select name, count(certified)
  from skill
  where name in ('p1','p2')
       and certified <=10
  group by name
) b;
  • 我可以将筛选条件移动到
上的
,因为
左连接将保留这两个名称
  • 我已经介绍了表别名
  • 所有列引用都是限定的,因此很清楚它们来自哪些表
  • 最后,问题是:

    试图找到技能名为p1、p2且认证>10的员工总数

    这是一个数字,不是每个员工的一行。我相信这回答了这个问题:

    SELECT COUNT(*)
    FROM (SELECT empnumber 
          FROM SKILL 
          HAVING SUM( name = 'p1' ) > 0 AND
                 SUM( name = 'p2' ) > 0 AND
                 SUM( certified > 10 ) > 0
          GROUP BY empnumber
         ) es;
    

    子查询查找具有所有三个条件的所有员工。
    SUM()
    是每个员工符合给定条件的技能数量。
    >0
    表示特定条件是匹配的。

    您好Caramelia,也许您可以提供一些正在分析的虚拟数据示例。这只会进一步过滤结果集。问题特别是如何添加缺少的行,而不是删除行。有些情况下,您的行不起作用,但当certified>10然后empNumber结束时,情况确实如此,甚至当certified>10然后0结束时,情况也是如此。你能解释一下逻辑吗。Tbh,你提供的逻辑对我来说是有道理的,但结果不一样way@CarameliaBachmann您是对的,应该没有
    ELSE
    条件(或者应该是
    ELSE NULL
    )。这里的问题是,
    COUNT
    将每个非
    NULL
    列的值计算为1,将NULL计算为零。
    SELECT COUNT(*)
    FROM (SELECT empnumber 
          FROM SKILL 
          HAVING SUM( name = 'p1' ) > 0 AND
                 SUM( name = 'p2' ) > 0 AND
                 SUM( certified > 10 ) > 0
          GROUP BY empnumber
         ) es;