2011-05-26 6 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............ 

лучшая идея у меня была должен был получать максимальный класс и удалять его, пока не закончится запись.

Редактировать: Уточнить: Мои заголовки столбцов не будут действительными курсами, чтобы указать количество курсов, на которые назначен учитель.

ответ

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.

Если вы хотите, чтобы список курсов (в одном столбце) был разделен запятыми, что намного проще и быстрее сгенерировать.


список Comma

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

Вы можете посмотреть на использовании сводной

Подробнее об этом здесь:

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

Вы можете использовать MAX на ID в качестве агрегатной функции я считаю.

+0

Я прочитал эту ссылку, и появляется все из значения известны. Я мог бы сделать подсчет отдельного курса по ID, чтобы получить мои # столбцов, но я никогда не узнаю имена курсов. – jimdrang

+0

Это усложняет ситуацию. Вы можете посмотреть на использование динамического SQL для этого, но я не уверен, что это ваш лучший вариант. Позвольте мне посмотреть, смогу ли я найти лучшее решение. –

+0

Динамическое число столбцов: http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx –

Смежные вопросы