SQL查询有两个表,计数和更多信息

时间:2016-12-13 03:53:19

标签: sql-server tsql

我刚刚学习这些东西而且我遇到了这个问题。我有两个表,STUDENTSADVISORS。使用附在顾问表主键上的外键为学生分配学生表中的顾问。

此处的任务是:提供所有顾问的列表以及分配给每个顾问的活跃学生人数。筛选出超过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'

非常感谢任何帮助。

修改

students table advisors table

2 个答案:

答案 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;