在MySQL中,如何将count(*)显示为0,而不是完全不显示行?
因此,下面是对声明的分解,试图找到拥有技能的员工总数:p1、p2和认证的>10在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
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;