关于count(*)和多个表的混乱SQL查询问题



我是研究数据库的初学者。我把我的问题搞砸了,不知道该怎么解决。如有任何建议,不胜感激

这是我的两张桌子:

  • 员工: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

基本上,你需要首先能够获得所有至少有一名员工参加的课程,这是在内部选择中完成的。一旦获得,您可以简单地通过计算所学的不同课程来查询输出,但查询他的时间。

干杯

最新更新