sql >> Base de Datos >  >> RDS >> Oracle

dos columnas pivotando en Oracle SQL

Para un número definido de pares de valores en las columnas tname, ttype puede usar la consulta a continuación (tenga en cuenta que cambié los nombres de las columnas del ejemplo, porque usó palabras clave de Oracle allí, también nombré la tabla como tasks , por lo que tendrá que cambiar estos datos a los nombres reales de las columnas y el nombre de la tabla en todas partes del código):

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)));

Para un número dinámico de posibilidades, necesitará algún procedimiento para "crear" esta consulta. Aquí usé view para esto. Copie el código del procedimiento y compílelo. Cuando los datos en su tabla cambian, primero debe ejecutar el procedimiento, luego simplemente seleccione desde la vista creada por el procedimiento. Para ejecutarse correctamente, su esquema necesita privilegios para crear vistas otorgadas.

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

Por supuesto, puede cambiar el orden de filas y columnas como desee agregando o modificando order by partes en código de procedimiento:

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;

Creo que también hay una solución más universal para su pregunta en el enlace que le di en los comentarios:Dynamic SQL Pivoting... . Parece muy prometedor, solo lea atentamente la sección Recursos en la parte inferior, y siga los pasos de la instrucción. No revisé este método personalmente, pero tal vez esto le convenga más que mi solución de "vista de procedimiento".