2016-12-13 8 views
0

私はこのことを覚えているだけで、この問題を抱えています。私は2つのテーブルSTUDENTSADVISORSを持っています。生徒は、advisorsテーブルの主キーにアタッチされた外部キーを使用して、studentsテーブル内のadvisorに割り当てられます。2つのテーブル、カウント、およびその他の情報を含むSQLクエリ

ここでの課題は次のとおりです。すべてのアドバイザーとそれぞれに割り当てられているアクティブな生徒のリストを提供します。 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' 

を表示する必要があります。

EDIT

students table advisors table

+1

あなたは、両方のテーブルのstrucure –

+0

を追加することができ、[この](http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-publicをお読みください-forum /)を使って質問を改善してください。また、適切なソフトウェア(MySQL、Oracle、DB2、...)とバージョンの両方でデータベースの質問にタグを付けると便利です。 'sql-server-2014'です。構文と機能の相違は、しばしば答えに影響します。 – HABO

+0

フィードバックをいただきありがとうございます。解明のために、これはSQL 2016 Expressを実行しています。私は次の投稿でうまくいくだろう。 – Wizzo

答えて

1

私はあなたの元の試みが正しい軌道に乗っていると思いますが、あなたが最初と最後の名の下に引っ張ってAdvisorsテーブルに再び参加する必要があり各アドバイザー。この理由は、集計を行った後に残っているのは、各アドバイザーと学生数のIDです。

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 

その他の注意事項:

あなたは、各顧問の統計をしたいので、私は、学生にLEFT JOIN顧問ではなく、他の方法で回避することにしました。あなたが最初に参加したように参加することで、どの学生にも合っていない顧問を除外することができます。これはあなたが望むふるまいではありません。なぜなら、どの生徒にも合致しないアドバイザーが生徒数をゼロにする必要があるからです。ここで

+0

ああ。左のジョイントビットの優位点。あなたはゼロを含む学生を含め、2人以下の学生を持つ顧問をすべて見たいと思うという点で正しいです。素晴らしいキャッチ! – Wizzo

+0

ありがとうございます。私はあなたの提案に基づいて私が探していたものを得ることができました。 – Wizzo

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; 
関連する問題