我试图写一个查询,给我每个人都有一个给定列表中的课程,他们有什么课程,以及一列有多少人有这个特定的课程。但是,如果我使用计数功能,那么我必须按每一列分组,然后给出该人在学术表中对该课程有多少记录的计数。有没有一种方法可以让我只计算有特定课程的人数。下面是一个表格,其中有一个我想要的结果的示例。
First_Name | Last_Name | People_id | Curriculum | courseum_count | 奥利维亚 | scott | 123456 | ACC | 2 | 以利亚
---|---|---|---|---|
米勒 | 234567 | ACC | 2 | |
威尔逊 | 345678 | 总线 | 1 | |
沃克 | 456789 | ENG | 3 | |
卡米拉 | 木材 | 567890 | ENG | 3 |
annet | 铁试剂 | 678901 | ENG | 3 |
要达到预期的结果,您需要使用子查询分别计算每个课程的人数。下面是一个应该工作的示例查询:
SELECT p.first_name, p.last_name, a.people_id, a.curriculum, c.curriculum_count
FROM academic a
JOIN people p ON p.people_id = a.people_id
JOIN (
SELECT curriculum, COUNT(DISTINCT people_id) AS curriculum_count
FROM academic
WHERE curriculum IN ('BUS', 'ACC', 'ENG')
GROUP BY curriculum
) c ON a.curriculum = c.curriculum
WHERE a.curriculum IN ('BUS', 'ACC', 'ENG')
子查询计算出现在学术表中的每个课程的不同人数。然后,主查询连接课程列上的子查询,将course_count列添加到结果中。
请注意,您仍然需要根据子查询和主查询中的三个特定课程进行筛选,否则您将获得学术表中所有课程的课程计数。
你想要一个窗口计数,例如
select
p.First_Name
, p.Last_Name
, a.People_Id
, a.Curriculum
, count(*) over (partition by a.Curriculum) Curriculum_Count
from academic a
join people p on p.People_Id = a.People_Id
where a.Curriculum in (
'bus',
'acc',
'eng'
);
注意表别名以提高可读性。
一致的大小写和命名使查询更容易阅读。