2011-05-26 45 views
0

我不知道每個人會有多少課程,或者哪些課程的名稱是由於多種可能性所致,因此我無法使用正常的子選擇或案例。SQL Server 2008解析未知條目數

我有這樣的一個表:

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............ 

我有個好主意將不斷得到最大CLASS並刪除它,直到我用完記錄。

編輯:澄清:我的專欄標題不會是真正的課程,只是一個方法來指定一個教師分配給多少課程。

回答

3

安倍晉三的建議是這樣的:

select * from Class 
pivot (COUNT(ID) for CLASS in ([Course1],[Course2],[Course3])) as Taking 

其中給出的結果是這樣的:

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

當然這不是你想要的稍微不同......你當然要1有「第一課程」的價值。唯一的方法是使用動態SQL。

如果您希望逗號分隔的課程列表(在一列中)更容易且更快速地生成。


逗號列表

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 2011-05-26 16:07:59

+0

@jimdrang - 會逗號分隔列表嗎? – Hogan 2011-05-26 16:37:35

+0

我想我可以把它,然後重新格式化它以分隔字段與列是編號。 – jimdrang 2011-05-26 16:56:58

2

你可以看一下使用PIVOT

瞭解更多關於在這裏:​​

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

您可以在ID使用MAX彙整功能,我相信。

+0

我通過鏈接閱讀,它似乎所有的值是已知的。我可以通過ID來計算不同的課程來獲得我的列數,但我永遠不會知道課程名稱。 – jimdrang 2011-05-26 15:53:25

+0

這使事情變得更加困難。你可以看看使用動態SQL來做到這一點,但我不知道這是你最好的選擇。讓我看看我能否找到更好的解決方案。 – 2011-05-26 15:59:20

+0

動態欄目數量:http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx – 2011-05-26 15:59:37