我是研究数据库的初学者。我把我的问题搞砸了,不知道该怎么解决。如有任何建议,不胜感激
这是我的两张桌子:
- 员工:eid(字符串(
-
info:eid(字符串(,cid(字符串,qtr(季度(,year(整数(
-
eid:员工id
- cid:课程id(员工参加的课程(
- qtr:季度(春季、冬季、夏季(
Info
是一个表,其中包含每个员工在给定季度和年份的情况下参加的课程的信息。而且课程只能选修一次。
员工可能会有报名缺口(没有必要每个季度都参加课程(
我需要弄清楚:
列出每个季度至少有一名员工参加但少于一名员工的课程数量(我想显示qtr、year、count(*((
例如,我的输出应该像下面的
qtr year num
-----------------
W 2001 2
W 2002 1
F 2003 1
这是我的代码
select
a.qtr, a.year, a.count(*) AS num
from
info a
where
(select *
from info b
where a.cid = b.cid and a.qtr = b.qtr and a.year = b.year and a.eid < b.eid)
group by
a.qtr, a.year
having
num > 0 and num < 3;
从获取每个季度每个课程的计数开始:
select cid, qtr, count(*) as num_employees
from info i
group by cid, qtr;
现在,您需要计数在特定值之间的那些。这是在GROUP BY
之后进行筛选,因此使用HAVING
子句:
select cid, qtr, count(*) as num_employees
from info i
group by cid, qtr
having count(*) > 0 and -- redundant because all courses have at least one student to be in the table
count(*) < 3;
好吧,这就是你可以做的,首先你需要能够选择每一年的所有不同季度,并简单地进行计数。这是如何实现的:
SELECT infor.qtr, infor.year , count(distinct(data_a.cid)) as Num
From infor
Inner Join
(SELECT distinct qtr, year, cid, count(eid) as EIDCount
From infor
Group by qtr, year, cid
having count(eid) >= 1 and count(eid) < 3) data_a
on infor.qtry = data_a.qtr and infor.year = data_a.year
group by infor.qtr, infor.year
基本上,你需要首先能够获得所有至少有一名员工参加的课程,这是在内部选择中完成的。一旦获得,您可以简单地通过计算所学的不同课程来查询输出,但查询他的时间。
干杯