计数函数-SQL

计数函数-SQL,sql,sql-server,tsql,join,group-by,Sql,Sql Server,Tsql,Join,Group By,我有这些练习表可以使用: create table complaints (compid int, compdate date, fineid int, description varchar) insert into complaints values (1010, '24-FEB-2017', 10001, NULL), (1011, '01-AUG-2017', 10003, NULL), (1012, '30-JUL-2017', 10004, NULL), (1013, '02-MAR

我有这些练习表可以使用:

create table complaints (compid int, compdate date, fineid int, description varchar)
insert into complaints values
(1010, '24-FEB-2017', 10001, NULL),
(1011, '01-AUG-2017', 10003, NULL),
(1012, '30-JUL-2017', 10004, NULL),
(1013, '02-MAR-2017', 10001, NULL)

create table Fines (fineID int, finedate date, empid int, amount int)
insert into Fines values
(10001, '01-FEB-2017', 1, 250),
(10002, '11-MAR-2017', 2, 250),
(10003, '25-JUN-2017', 4, 500),
(10004, '23-JUL-2017', 4, 250)
(10005, '31-JUL-2017', 3, 250)

create table Employees (empid int, empname nvarchar(100), workingsince date)
insert into Employees values
(1,'John','01-JAN-2007'),
(2,'Abe','01-JUL-2008'),
(3,'Don','01-JAN-2013'),
(4,'Gon','01-JAN-2017')
现在,我想创建一个查询,显示每个员工的姓名、罚款数量和投诉数量(都在同一个表中-empname、numofines、NumOfComp)


似乎我需要两列计数函数,但我找不到一种方法。

您可以使用聚合:

select 
    e.empname,
    count(distinct f.fineid) no_fines,
    count(distinct c.compid) no_complaints
from employees e
left join fines f      on f.empid = e.empid
left join complaints c on c.fineid = f.fineid
group by e.empid, e.empname

empname | no_fines | no_complaints :------ | -------: | ------------: Abe | 1 | 0 Don | 1 | 0 Gon | 2 | 2 John | 1 | 2 empname |无罚款|无投诉 :------ | -------: | ------------: 阿贝| 1 | 0 唐| 1 | 0 贡| 2 | 2 约翰| 1 | 2
@爱德华多尔梅达:这样的话,一个投诉就可以被处以不止一次的罚款。这似乎是不可能的。大概
compid
投诉的主键
——因此每个投诉都与
fineid
列中的一个罚款关联所有涉及的表的主键是什么?数据模型似乎也错了。一名员工可以被处以零至多次罚款。每个罚款可以有零到多个投诉,但可能有一个没有相应投诉的罚款?那么,罚款的目的是什么呢?请阅读一些关于改进问题的提示。员工可以处以0到多个罚款,每个罚款可以有0到多个违规者。是的,可以由员工处以罚款,并且没有投诉。也许我不明白你的问题,对,我明白。我认为罚款是员工因投诉而收到的。我现在看到他们是由员工发出的,可能会引起投诉