我刚刚学习这些东西而且我遇到了这个问题。我有两个表,STUDENTS
和ADVISORS
。使用附在顾问表主键上的外键为学生分配学生表中的顾问。
此处的任务是:提供所有顾问的列表以及分配给每个顾问的活跃学生人数。筛选出超过1名学生的任何顾问。
目前的脚本如下:
select
Students.AdvisorID, count(Students.AdvisorID) as 'TotalStudents'
from
Students
left outer join
Advisors on Students.AdvisorID = Advisors.AdvisorID
where
Students.IsActive = 1
Group by
Students.AdvisorID
Having
count(Students.AdvisorID) < 2
这将输出一个正确的列表,仅显示advisorID
和学生总数。
我还需要显示
Advisors.FirstName + ' ' + Advisors.LastName as 'AdvisorName'
非常感谢任何帮助。
修改
答案 0 :(得分:1)
我认为您的原始尝试是在正确的轨道上,但您需要再次加入hal3
表格以获取每位顾问的名字和姓氏。这样做的原因是,在进行聚合之后,剩下的就是每个顾问的ID和学生数。
Advisors
其他说明:
我选择SELECT t1.AdvisorID,
t2.TotalStudents,
t1.FirstName + ' ' + t1.LastName AS AdvisorName
FROM Advisors t1
INNER JOIN
(
SELECT a.AdvisorID, COUNT(*) AS TotalStudents
FROM Advisors a
LEFT JOIN Students s
ON a.AdvisorID = s.AdvisorID
GROUP BY a.AdvisorID
HAVING COUNT(*) < 2
) t2
ON t1.AdvisorID = t2.AdvisorID
向学生提供顾问,而不是相反,因为您需要为每位顾问提供统计数据。首次进行加入可以过滤掉与任何学生不匹配的顾问。这不是您想要的行为,因为与任何学生不匹配的顾问的学生人数应为零。
答案 1 :(得分:0)
这里有一些与
配合使用的示例数据USE tempdb
GO
IF OBJECT_ID('tempdb.dbo.Advisors') IS NOT NULL DROP TABLE dbo.Advisors;
IF OBJECT_ID('tempdb.dbo.Students') IS NOT NULL DROP TABLE dbo.Students;
CREATE TABLE dbo.Advisors (AdvisorID int primary key, AdvisorName varchar(100));
CREATE TABLE dbo.Students
(
studentID int identity primary key,
AdvisorID int foreign key references dbo.Advisors(AdvisorID)
);
INSERT dbo.Advisors VALUES (1, 'Mr. White'),(2,'Walter Jr.'),(3,'Mr. Pinkman');
INSERT dbo.Students (AdvisorID)
SELECT TOP (20) abs(checksum(newid())%3)+1 FROM sys.all_columns;
不需要左加入,我想这会给你你想要的东西。
SELECT a.AdvisorID, total_students = COUNT(*)
FROM dbo.Advisors a
INNER JOIN dbo.Students s ON a.AdvisorID = s.AdvisorID
GROUP BY a.AdvisorID
HAVING COUNT(*) < 2;