SQL Server 2008 анализирует неизвестное количество записей - PullRequest
0 голосов
/ 26 мая 2011

Я не знаю, сколько курсов будет у каждого человека или каковы названия курсов из-за количества возможностей, поэтому я не могу использовать обычный дополнительный выбор или случай.

У меня естьтаблица, подобная этой:

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 и удаляйте его до тех пор, пока у меня не закончатся записи.

правка: Уточнение: мои заголовки столбцов не будут фактическими курсами, а просто способ подсчитать, сколько курсов назначено учителю.

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

Предложение Абэ выглядит следующим образом:

 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.

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

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
2 голосов
/ 26 мая 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...