SQL计数在多个列上,包括0值

时间:2018-03-21 08:42:18

标签: sql postgresql

我已经加入了我的表格,这样每个条目都是唯一的,我希望得到一个COUNT()值,用于教师教授的多少独特课程。我想我会制作一个不同课程的表,然后根据老师的ID进行计数,但是这并不能说明没有教授课程的老师,我希望在这种情况下返回零值。我如何获得这些零值?

表格供参考:

  id   |    name    | course_id | sec_id | semester | year
-------+------------+-----------+--------+----------+------
 33456 | A          |           |        |          |
 10101 | B          | CS-101    | 1      | Fall     | 2009
 76766 | C          | BIO-301   | 1      | Summer   | 2010
 12121 | D          | FIN-201   | 1      | Spring   | 2010
 10101 | B          | CS-347    | 1      | Fall     | 2009
 76543 | E          |           |        |          |
 83821 | F          | CS-319    | 2      | Spring   | 2010
 83821 | F          | CS-190    | 2      | Spring   | 2009
 98345 | G          | EE-181    | 1      | Spring   | 2009
 10101 | B          | CS-315    | 1      | Spring   | 2010
 22222 | H          | PHY-101   | 1      | Fall     | 2009
 45565 | I          | CS-101    | 1      | Spring   | 2010
 15151 | J          | MU-199    | 1      | Spring   | 2010
 32343 | K          | HIS-351   | 1      | Spring   | 2010
 83821 | F          | CS-190    | 1      | Spring   | 2009
 45565 | I          | CS-319    | 1      | Spring   | 2010
 76766 | C          | BIO-101   | 1      | Summer   | 2009
 58583 | L          |           |        |          |

PS。我相信我正在使用PostgreSQL。

[编辑]预期结果是一个id,名称和一个数字表,显示了老师所教授的课程数量,如果他们没有教授任何课程,则包括0。

[编辑2]我只需要对表进行查询,所有其他工作都已完成。如果course_id,sec_id,semester,year没有值,则该教师教授课程(对于教师A,E和L;他们的计数为0)。我只需要一种方法来计算这些课程,没有别的。

3 个答案:

答案 0 :(得分:1)

我们假设表名是t:

select distinct count(course_id) filter (where course_id is not null) over (partition by id,name),id, name 
from t 
order by name;
 count |  id   |     name
-------+-------+--------------
     0 | 33456 |  A
     3 | 10101 |  B
     2 | 76766 |  C
     1 | 12121 |  D
     0 | 76543 |  E
     3 | 83821 |  F
     1 | 98345 |  G
     1 | 22222 |  H
     2 | 45565 |  I
     1 | 15151 |  J
     1 | 32343 |  K
     0 | 58583 |  L
(12 rows)

https://www.postgresql.org/docs/current/static/sql-expressions.html

答案 1 :(得分:0)

我相信,这个查询应该可以胜任:

SELECT COUNT(DISTINCT course_id),t.id,name FROM courses r Right Outer JOIN teacher t ON(r.id = t.id)group by t.id,name;

我认为,并非所有教师都在桌面上提供,因此需要外部加入。在Oracle上的类似数据库上进行了测试。

答案 2 :(得分:0)

使用join执行subquery以查找教师课程计数

select t.name, coalesce(c.course_count, 0) course_count     
from table t left join (
     select name, count(distinct course _id) course_count 
     from table 
     group by name    
) c on c. name = t.name
group by t.name