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

две колони Завъртане в Oracle SQL

За определен брой двойки стойности в колони tname, ttype можете да използвате заявката по-долу (имайте предвид, че промених имената на колоните ви от примера, тъй като използвахте ключови думи на Oracle там, също така наименувах таблицата като tasks , така че ще трябва да промените тези данни на вашите истински имена на колони и име на таблица навсякъде в кода) :

select * from tasks 
pivot (max(tdate) for (tname, ttype) in 
  (('DG1','CF') DG1_CF, ('M0','A')  M0_A,  ('M0','POR') M0_POR,
   ('M1','A'  ) M1_A,   ('M1','CF') M1_CF, ('M2','A')   M2_A)));

За динамичен брой възможности ще ви трябва някаква процедура, "създаваща" тази заявка. Тук използвах view за това. Копирайте кода на процедурата и го компилирайте. Когато данните във вашата таблица се променят, първо трябва да изпълните процедура, след което просто да изберете от изглед, създаден от процедура. За да работи правилно, вашата схема се нуждае от предоставени привилегии за създаване на изгледи.

execute create_tasks_view;
select * from v_tasks;

anonymous block completed
   ID DG1_CF     M0_A       M0_POR     M1_A       M1_CF      M2_A     
----- ---------- ---------- ---------- ---------- ---------- ----------
45000 2015-03-02 2015-02-01 2015-03-11 2015-02-03 2015-03-01 2015-02-04 
44400 2015-02-02 2015-01-01 2015-02-11 2015-01-03 2015-02-01 2015-01-04

Разбира се, можете да промените реда на редовете и колоните, както желаете, като добавите или промените order by части в кода на процедурата:

create or replace procedure create_tasks_view as 
  v_sql varchar2(32767) := '';
begin
  for v in (select distinct tname, ttype from tasks order by tname, ttype) 
  loop
    v_sql := v_sql || '(''' || v.tname || ''',''' || v.ttype || ''') '
      ||v.tname||'_'||v.ttype||',';
  end loop;
  v_sql := 'create or replace view v_tasks as '
    ||'select * from tasks pivot (max(tdate) for (tname, ttype) in ('
    ||rtrim(v_sql, ', ')||'))'; 
  execute immediate v_sql;
end create_tasks_view;

Вярвам, че има и по-универсално решение за вашия въпрос във връзката, която ви дадох в коментарите:Динамично SQL завъртане... . Изглежда много обещаващо, просто прочетете внимателно раздела Ресурси в долната част и следвайте стъпките от инструкциите. Не съм проверявал този метод лично, но може би това ще ви подхожда повече от моето решение за „изглед на процедурата“.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извличане на структура на таблица с динамичен SQL

  2. Времево клеймо на Oracle към sql сървър DateTime

  3. 2 начина за връщане на редове, които съдържат само небуквени и цифрови знаци в Oracle

  4. SQL SELECT Сумиране на стойности без включване на дубликати

  5. Как мога да извлека следващите n отключени реда от Oracle?