Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle SQL Transpose

Бих предложил първо да приложите функцията UNPIVOT към множеството си колони, след което да използвате row_number() за да създадете новите си имена на колони, които ще се използват в PIVOT.

Основният синтаксис за unpivot ще бъде

избор на поле, стойност, 'стойност'|| to_char(row_number() over(разделяне по ред на полето по стойност)) seqfrom yourtableunpivot(стойност за поле в (Име, Възраст, Пол, DOB, col1, col2, col3)) u; 

Вижте SQL Fiddle с демонстрация . Това ще преобразува вашите множество колони с данни в множество редове. Използвах row_number() за да създадете уникална стойност за вашите нови имена на колони, данните от тази заявка изглеждат така:

<предварителен код>| ПОЛЕ | СТОЙНОСТ | SEQ ||-------|-------------------------|--------|| ВЪЗРАСТ | 12 | стойност1 || ВЪЗРАСТ | 15 | стойност2 || COL1 | аа | стойност1 || COL1 | xx | стойност2 |

След това можете да приложите функцията 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 с демонстрация




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да се обърнете към колона по ID или номер на индекс

  2. да инсталирате Oracle Instantclient на Mac OS/X без да задавате променливи на средата?

  3. ora-00972 идентификаторът е твърде дълъг oracle 10g

  4. Как да върнете броя на секундите след полунощ в базата данни на Oracle

  5. Как да добавя едно към низ в oracle