2017-05-04 7 views
3

私は比較的新しいSQLです。私は現在、次のCoursesTbl最小値と最大値を持たないSQL集計

StudentName  CourseID  InstructorName 
    Harry Potter  180  John Wayne 
    Harry Potter  181  Tiffany Williams 
    John Williams 180  Robert Smith 
    John Williams 181  Bob Adams 

は、今、私が本当に欲しいものこれで持っている:私はこのクエリを試してみた

StudentName  Course1(180)  Course2(181) 
Harry Potter John Wayne  Tiffany Williams 
John Williams Robert Smith Bob Adams 

Select StudentName, Min(InstructorName) as Course1, Max(InstructorName) as 
Course2 from CoursesTbl 
Group By StudentName 

は、今では私が必要とする私には明らかです学生名でグループ化する。しかしMinとMaxを使用するとインストラクターの指示が乱れる。

すなわちハリーのためMinはジョン・ウェインで、マックスはジョン・ウィリアムズのためのティファニーウィリアムズ
分では、ボブ・アダムスとマックスはロバート・スミスです。

したがって、インストラクターは正しい順序で表示されません。

これはどのように修正できますかお勧めしますか?

+0

あなたが必要とするものは、集計関数ではなく、 'PIVOT'です。見てみましょう[ここ](https://blogs.msdn.microsoft.com/spike/2009/03/03/pivot-tables-in-sql-server-a-simple-sample/) –

答えて

4

あなたは、列にデータをピボットする集約関数と一緒にCASE文で条件付きの集約を使用することができます。

select 
    [StudentName], 
    Course1 = max(case when CourseId = 180 then InstructorName end), 
    Course2 = max(case when CourseId = 181 then InstructorName end) 
from #Table1 
group by StudentName 

Demoを参照してください。 PIVOT関数を使用して結果を得ることもできます:

select 
    StudentName, 
    Course1 = [180], 
    Course2 = [181] 
from 
(
    select StudentName, 
    CourseId, 
    InstructorName 
    from #Table1 
) d 
pivot 
( 
    max(InstructorName) 
    for CourseId in ([180], [181]) 
) piv 

もう1つDemo

+1

トリックをやった。そのように私のcourseID'sは180または181のいずれかになることが事前に知られている。これは完全にうまくいく。ありがとう! – paratrooper

+0

うまくいってくれてうれしいですが、「courseIDs」が不明な場合は、同じ結果を得るために動的SQLを使用する必要があります。 – ollie

関連する問題