2015-10-06 1 views
1

Мне интересно, если в любом случае разбить столбец с несколькими значениями в отдельные столбцы. Вот пример того, что я хочу сделать: Предположим, у меня есть таблица 1 следующим образом:сплющивание таблицы с SQL

Team | Value_descriptor| Value 
Team1| Coach   | McGuire 
Team1| Manager   | Thompson 
Team1| City   | Detroit 
Team2| Coach   | Johnson 
Team2| Manager   | Stevenson 
Team2| City   | LA 

И я хотел бы, чтобы произвести таблицу следующим образом:

Team | Coach | Manager | City 
Team1| McGuire | Thompson| Detroit 
Team2| Johnson | Stevenson| LA 
... 

Предположим, что я буду делать вторая таблица первая. Есть ли запрос, который может возвращать значения во второй таблице из первой таблицы?

+3

Какие СУБД вы используете? Некоторые продукты имеют функциональные возможности, которые могут быть полезны здесь. – jarlh

ответ

2

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

select t1.Team, 
     max(case when t1.Value_Descriptor = 'Coach' then t1.Value end) as Coach, 
     max(case when t1.Value_Descriptor = 'Manager' then t1.Value end) as Manager, 
     max(case when t1.Value_Descriptor = 'City' then t1.Value end) as City 
    from table1 t1 
group by t1.Team 

В качестве альтернативы, ваша база данных может предложить определенный синтаксис для поворота для вас.

+0

Это будет работать, если в базе данных нет команды-тренера в базе данных. – Reinard

+0

@Sir Troll: Я думаю, что это безопасное предположение. В противном случае данные OP не будут иметь большого смысла. – sstan

0

Здесь ответ мит PIVOT протестирована в Oracle DB

select * from tst 
pivot (max(Value) for (Value_descriptor) in (
'City' as "CITY", 
'Manager' as "MANAGER", 
'Coach' as "COACH")) 
; 

.

TEAM   CITY   MANAGER   COACH   
--------------- --------------- --------------- --------------- 
Team2   LA    Stevenson  Johnson   
Team1   Detroit   Thompson  McGuire 

Следует отметить, что приведенный выше запрос, в случае, если есть несколько значений для конкретного value_descriptor выбирает значение MAX (по алфавиту).

Если вы хотите, чтобы показать все значения сцепляются заменить агрегатную функцию с listagg

pivot (listagg(Value,', ') within group (order by value) for (Value_descriptor) in (