2016-12-13 1 views
0

Ich lerne gerade diese Sachen und ich habe Probleme mit diesem. Ich habe zwei Tabellen, STUDENTS und ADVISORS. Den Schülern werden Berater in der Studententabelle zugewiesen, die einen Fremdschlüssel verwenden, der an den Primärschlüssel der Advisor-Tabelle angehängt ist.SQL-Abfrage mit zwei Tabellen, Anzahl und weitere Informationen

Die Aufgabe ist hier: Stellen Sie eine Liste aller Berater und die Anzahl der aktiven Studenten zur Verfügung. Herausfiltern von Beratern mit mehr als einem Studenten

Das aktuelle Skript ist unten aufgeführt:

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 

Dies wird Ausgang eine richtige Liste nur die advisorID und insgesamt Studenten zeigt.

Ich brauche auch die

Advisors.FirstName + ' ' + Advisors.LastName as 'AdvisorName' 

Jede Hilfe wäre sehr dankbar angezeigt werden soll.

EDIT

students table advisors table

+1

können Sie sowohl Tabelle strucure hinzufügen –

+0

Bitte lesen Sie [diese] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public -forum /) für einige Tipps zur Verbesserung Ihrer Frage. Es ist auch hilfreich, Datenbankfragen mit der entsprechenden Software (MySQL, Oracle, DB2, ...) und der Version, z. 'sql-server-2014'. Unterschiede in Syntax und Funktionen beeinflussen oft die Antworten. – HABO

+0

Danke für die Rückmeldung. Zur Verdeutlichung führt dies SQL 2016 Express aus. Ich werde es mit meinem nächsten Beitrag besser machen. – Wizzo

Antwort

1

Ich denke, Ihr ursprünglicher Versuch, auf dem richtigen Weg ist, aber Sie müssen wieder in die Advisors Tabelle verbinden in dem Vor- und Nachnamen ziehen für jeder Berater. Der Grund dafür ist, dass nach der Aggregation nur noch eine ID für jeden Berater und eine Schüleranzahl übrig bleibt.

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 

Andere Anmerkungen:

Ich wählte zu LEFT JOIN Berater für Studenten, nicht umgekehrt, da Sie eine Statistik für jeden Berater wollen. Wenn Sie den Join wie gewohnt durchführen, können Sie Berater herausfiltern, die mit keinem der Studenten übereinstimmen. Dies ist nicht das gewünschte Verhalten, da ein Berater, der zu keinem Schüler passt, eine Schülerzahl von Null haben sollte.

+0

Ahh. Ausgezeichneter Punkt auf der linken Seite. Du hast Recht damit, dass ich alle Berater mit weniger als 2 Studenten sehen möchte, einschließlich derjenigen mit Null. Super Fang! – Wizzo

+0

Danke dafür. Ich war in der Lage zu bekommen, was ich suchte, basierend auf Ihrem Vorschlag. – Wizzo

0

Hier ist eine kleine Datenprobe mit

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; 

Keine LEFT JOIN erforderlich arbeiten, ich denke, das wird dir geben, was Sie suchen.

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; 
Verwandte Themen