Бих предложил първо да приложите функцията UNPIVOT към множеството си колони, след което да използвате row_number()
за да създадете новите си имена на колони, които ще се използват в PIVOT.
Основният синтаксис за unpivot ще бъде
избор на поле, стойност, 'стойност'|| to_char(row_number() over(разделяне по ред на полето по стойност)) seqfrom yourtableunpivot(стойност за поле в (Име, Възраст, Пол, DOB, col1, col2, col3)) u;
Вижте SQL Fiddle с демонстрация
. Това ще преобразува вашите множество колони с данни в множество редове. Използвах row_number()
за да създадете уникална стойност за вашите нови имена на колони, данните от тази заявка изглеждат така:
След това можете да приложите функцията PIVOT към този резултат:
select field, value1, value2from( select field, value, 'value'|| to_char(row_number() over(partition by field order by value)) seq from yourtable unpivot ( value for field in (Name, Възраст, пол, DOB, col1, col2, col3) ) u) dpivot( max(value) for seq in ('value1' as value1, 'value2' as value2)) piv
Вижте SQL Fiddle с демонстрация . Това дава краен резултат:
<предварителен код>| ПОЛЕ | СТОЙНОСТ1 | СТОЙНОСТ2 ||-------|-------------------------|------------- ------------|| ВЪЗРАСТ | 12 | 15 || COL1 | аа | xx || COL2 | bb | yy || COL3 | cc | zz || DOB | 07 август 2001 г. 12:00:00 ч. | 26 август 2001 г. 12:00:00 || ИМЕ | A | Б || СЕКС | F | M |Забележете, че когато прилагате функцията unpivot, типът данни на всички колони трябва да е един и същ, така че може да се наложи да преобразувате данните си в подзаявка, преди да можете да я отмените.
Функцията UNPIVOT/PIVOT беше въведена в Oracle 11g, ако използвате Oracle 10g, тогава можете да редактирате заявката, за да използвате:
с cte as( изберете полето 'име', стойността на името от съюза на вашата таблица всички изберете полето 'Възраст', стойността на възрастта от съюза на вашата таблица изберете полето 'Пол', стойността на пола от съюза на вашата таблица изберете 'DOB' поле, DOB стойност от обединението на вашата таблица всички изберете поле „col1“, стойност на col1 от обединение на вашата таблица всички изберете поле „col2“, стойност col2 от обединение на вашата таблица всички изберете поле „col3“, стойност col3 от вашата таблица) изберете поле, макс (случай, когато seq ='value1' след това край на стойността) value1, max(случай, когато seq ='value2' след това край на стойността) value2from( изберете поле, стойност, 'стойност'|| to_char(row_number() over(разделяне по ред на полето по стойност) ) seq from cte) dgroup by field;
Вижте SQL Fiddle с демонстрация