2011-05-26 7 views
0

各人が持つコースの数や可能性のためにコース名がわからないため、通常のサブセレクトやケースを使用できません。SQL Server 2008 Parse Unknownエントリ数

私はこのようなテーブルを持っている:

ID NAME  CLASS 
---------------------- 
1  BOB  Course1 
1  BOB  Course2 
1  BOB  Course3 
2  JOHN  Course1 
2  JOHN  Course2 
3  SAM  Course1 
4  BILL  Course2 
4  BILL  Course3 

私は最後の列はほとんどのクラスを持っている誰のためにある場合、それはこのように見えるようにしたい:

ID NAME  CLASS  CLASS2  CLASS3  CLASS4.......... 
------------------------------------------------------ 
1  BOB  Course1 Course2 Course3 NULL............ 
2  JOHN  Course1 Course2 NULL  NULL............ 
3  SAM  Course1 NULL  NULL  NULL............ 
4  BILL  Course2 Couse3  NULL  NULL............ 

私が持っていた最高のアイデアを私がレコードがなくなるまで、最大のクラスを取得して、それを削除することでした。

編集:To Clarify:私の列見出しは、実際の講座ではなく、教師が割り当てられている科目の番号をつけるだけです。

答えて

3

安倍さんの提案は、次のようになります。もちろん、

Name Course1 Course2 Course3 
BILL 0  1  1 
BOB  1  1  0  
JOHN 1  1  0 
SAM  1  0  0  

これはあなたが望むものよりもわずかに異なっているが...あなたが持っているコース1が欲しいです「最初のコース」の価値。これを行う唯一の方法は動的SQLです。

生成するのがはるかに簡単で高速なコースをコンマで区切って(1つの列に)並べ替えたい場合は、


コンマリスト

select c.Name, 
     STUFF((SELECT (', ' + c2.Class) 
       FROM #Class c2 
       WHERE c.Name = c2.Name 
       ORDER BY c2.Class 
       FOR XML PATH('')),1,2,'') as [Class List] 
FROM #Class c 
GROUP BY c.Name 

はあなたに与える:

Name Class List 
BILL Course2, Course3 
BOB Course1, Course2, Course3 
JOHN Course1, Course2 
SAM Course1 
+0

はい、私はコース数が少なく、名前はうまくいくが、私は数千のコースがあり、名前は日々変わることがある。 – jimdrang

+0

@jimdrang - コンマ区切りリストはあなたのために働くでしょうか? – Hogan

+0

私はそれを取って、列の番号をつけてフィールドを区切るように再フォーマットすることができると思います。 – jimdrang

2

あなたがここでそれについての詳細を読むPIVOT

を使用して見ることができます:

http://msdn.microsoft.com/en-us/library/ms177410.aspx

は、私は信じているあなたの集計関数としてIDでMAXを使用することができます。

このような結果得られ
select * from Class 
pivot (COUNT(ID) for CLASS in ([Course1],[Course2],[Course3])) as Taking 

+0

を私はそのリンクを読み、すべての値が知られている表示されます。私はカラム数を得るためにIDで別のコースを数えることができますが、コース名は決して分かりません。 – jimdrang

+0

これは物事をより困難にします。あなたは動的SQLを使ってこれを行うことができますが、それがあなたの最良の選択肢であるかどうかはわかりません。よりよい解決策が見つかるか見てみましょう。 –

+0

動的な列数:http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx –