2013-12-06 7 views
2

Я очень новичок в SQL. Я навсегда искал на этом сайте ответ на этот вопрос, но я не мог. У меня есть данные, что выглядит следующим образом:Транспонирование двух столбцов в SQL

Code | Name 
A | John 
A | Bob 
A | Chris 
B | James 
B | Jen 
B | Teddy 

Я хотел бы, чтобы создать запрос, который привел бы к этим:

Code | Name | Name2 | Name3 
A | John | Bob | Chris 
B | James| Jen | Teddy 

Любая помощь будет принята с благодарностью.

+0

Посмотрите здесь http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx –

+0

Побольше разъяснение помогло бы –

+0

Вы смотрели на 'UNPIVOT'? – mrtig

ответ

1

Решение должно использовать PIVOT. Тем не менее, PIVOT предназначен для использования в значениях категории, что означает, что у вас одинаковый набор категорий для каждой группы. У вас нет ничего подобного между каждой группой, например, «индекс имени» или что-то еще. Таким образом, вы не можете правильно определить столбцы PIVOT.

Простое решение заключается в изготовлении категории для каждого имени в группе, как Name1, Name2, Name3 и т.д., которые вы можете PIVOT на. Это может быть сделано с ROW_NUMBER() пункта, как это:

select Code, 
    'Name' + cast(
     row_number() over (partition by Code order by code) 
    as varchar(10)) as NameType, 
    Name 
from table1 

который производит результаты, которые выглядят следующим образом:

| CODE | NAMETYPE | NAME | 
|------|----------|-------| 
| A | Name1 | John | 
| A | Name2 | Bob | 
| A | Name3 | Chris | 
| B | Name1 | James | 
| B | Name2 | Jen | 
| B | Name3 | Teddy | 

Теперь у вас есть что-то общее между группами PIVOT на - в NAMETYPE колонке:

select * from ( 
    select Code, 
    'Name' + cast(
     row_number() over (partition by Code order by code) 
    as varchar(10)) as NameType, 
    Name 
    from table1 
) a 
pivot (max(Name) for [NameType] in ([Name1], [Name2], [Name3])) piv 

Это дает желаемые результаты:

| CODE | NAME1 | NAME2 | NAME3 | 
|------|-------|-------|-------| 
| A | John | Bob | Chris | 
| B | James | Jen | Teddy | 

Демо: http://www.sqlfiddle.com/#!6/21499/7

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