2012-06-26 8 views
6

tengo esta tabla con los datos siguientesfilas de repetición basadas en el valor de la columna en cada fila



Job  Quantity Status Repeat  
1    100      OK     2  
2    400      HOLD   0  
3    200      HOLD   1  
4    450      OK     3  

basa en el valor de la columna Repetir para cada fila, la fila deben repetirse de nuevo. Por ejemplo, para la tarea 1, el valor de repetición es 2, por lo que la tarea 1 debe repetirse dos veces más.

La tabla resultante debe ser de la siguiente manera



Job    Quantity Status Repeat  
1      100       OK     2  
1      100       OK     2  
1      100       OK     2  
2      400       HOLD   0  
3      200       HOLD   1  
3      200       HOLD   1  
4      450       OK     3  
4      450       OK     3  
4      450       OK     3  
4      450       OK     3  

Por favor alguien puede ayudar con esta consulta? estoy usando Oracle 10g

Respuesta

7

Suponiendo que no va a generar más de 1000 filas por fila:

with num as (select level as rnk from dual connect by level<=1000) 
select Job, Quantity, Status, Repeat, rnk 
from t join num on (num.rnk <= repeat) 
order by job, rnk; 

Aquí está una prueba: http://sqlfiddle.com/#!4/4519f/12

ACTUALIZACIÓN: Como dijo Jeffrey Kemp, puede "detectar" al máximo con una subconsulta:

with num as (select level as rnk 
      from dual 
      connect by level<=(select max(repeat) from t) 
      ) 
select job, quantity, status, repeat, rnk 
from t join num on (num.rnk <= repeat) 
order by job, rnk; 
+0

+1, además podría reemplazar '1000' con una subconsulta para encontrar el valor máximo para repetir. –

+0

u chicos r impresionante .. + 10..gracias .. – user991255

-1

En lugar de hacer esta manipulación con consulta puede obtener estos datos primero en una tabla de datos y agregar filas a una nueva tabla de datos basada en el valor de repetir y luego enlazar esta nueva tabla de datos.

7

Se puede usar un CTE recursiva:

with cte(Job, Repeat, i) as 
     (
     select Job 
     ,  Repeat 
     ,  0 
     from YourTable 
     union all 
     select Job 
     ,  Repeat 
     ,  i + 1 
     from cte 
     where cte.i < cte.Repeat 
     ) 
select * 
from cte 
order by 
     Job 
,  i 

Live example at SQL Fiddle.

+0

sólo Oracle introdujo CTE recursiva (factoring subconsulta AKA) en 11gR2. Por desgracia, los OP dicen que están usando 10g. – APC

+0

+1 de mí. Es una buena solución de todos modos. –

+0

Gracias, está funcionando genial. Aunque no entiendo el CTE recursivo, le agradecería que me lo explicara un poco. – Akbari

Cuestiones relacionadas