我想计算分配给每位员工的项目数量。但是我也希望包含那些目前没有在任何项目上工作的人的名字,显然计数值应为空白或为空。以下是我到目前为止所做的事情:
Select
lname
, ssn
, COUNT(*) AS projectnum
FROM
employee LEFT OUTER JOIN works_on
ON essn=ssn
GROUP BY
lname
ORDER BY
projectnum DESC
它工作得很好,除了在projectnum字段中,它为那些不在任何项目上工作的人提供1而不是null,我该如何解决?
答案 0 :(得分:2)
你算错了。假设count(*)
基本上对返回的行进行计数,您将获得具有NULL项目的行(按预期),但count(*)
将这些行视为行,因此您获得1
。如果没有项目,则需要计算一个为NULL的列;如果存在,则需要非NULL;
select ..., count(c) as projectnum ....
其中c
是来自works_on
的非空列。
例如,我在MySQL沙箱中有这些表:
mysql> select * from posts;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
mysql> select * from posts_tags;
+---------+--------+
| post_id | tag_id |
+---------+--------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 2 |
| 2 | 3 |
| 3 | 2 |
+---------+--------+
您可以看到count(*)
和count(tag_id)
:
mysql> select posts.id, count(*) from posts left join posts_tags on posts.id = posts_tags.post_id group by posts.id;
+------+----------+
| id | count(*) |
+------+----------+
| 1 | 3 |
| 2 | 2 |
| 3 | 1 |
| 4 | 1 |
+------+----------+
mysql> select posts.id, count(tag_id) from posts left join posts_tags on posts.id = posts_tags.post_id group by posts.id;
+------+---------------+
| id | count(tag_id) |
+------+---------------+
| 1 | 3 |
| 2 | 2 |
| 3 | 1 |
| 4 | 0 |
+------+---------------+
在第一个count(*)
中执行1
会为id=4
提供一个流浪count(tag_id)
,但在第二个0
中会为您提供预期的{{1}}。