none
¿Cómo duplicar registros en base al valor de un campo? RRS feed

  • Pregunta

  • Hola

    Tengo que duplicar registros en una tabla basado en el valor de un campo.  En mi tabla ese campo es repeticiones.  Me puse a buscar ejemplos y encontre uno que aparentemente funciona y lo adapte a lo que necesito, pero estoy obteniendo un mensaje de error:  Msg 530, Level 16, State 1, Line 3 The statement terminated. The maximum recursion 100 has been exhausted before statement completion.

    Agregué al final la sentencia OPTION (MAXRECURSION 0), pero obtengo un ciclo infinito.  Si le fijo un valor a MAXRECURSION siempre obtengo el mensaje de error.

    ¿Qué estaré haciendo mal? ¿Pueden ayudarme.

    Abajo les dejo las sentencias que estoy utilizando. Y una muestra de la tabla.

    id    nombre    apellido1    fechaAlta         fechaBaja        repeticiones
    1    Ana          Pérez         2019-01-01    NULL               2
    2    Carola      Sanz          2019-02-01    2019-12-31    3
    3    Ismael      Sol            2018-07-15    2019-11-30     4
    4    Sebastian Ruiz           2019-01-01    2019-08-01     5
    5    Isa           Rex            2019-01-01    NULL                6

    ;WITH cte AS
    (
        SELECT * FROM [NominasLicitaciones].[dbo].[miTablaSingular]
        UNION ALL

        SELECT cte.[id]
          ,cte.[nombre]
          ,cte.[apellido1]
          ,cte.[fechaAlta]
          ,cte.[fechaBaja]
          ,cte.[repeticiones]
        FROM cte INNER JOIN [NominasLicitaciones].[dbo].[miTablaSingular] t
            ON cte.[id] > t.[id]
        WHERE cte.[repeticiones] > 1
    )
    SELECT [id], [nombre], [apellido1], [fechaAlta], [fechaBaja], 1 [repeticiones]
        FROM cte
        ORDER BY 1

        
    miércoles, 6 de enero de 2021 2:20

Todas las respuestas

  • Hola:

    Se supone que en la tabla tienes filas repetidas con el mismo id?

    Si no es el caso, cuál es el id a mostrar.

    Tal cual planteas la pregunta, el uso de un cte recursivo no parece la mejor opción.

    Puedes poner más filas de la tabla donde se vean esas repeticiones y cuál es la salida esperada?

    miércoles, 6 de enero de 2021 8:54
  • Hola Odlarhg:

    Create table dbo.losDatos  (id int, nombre varchar(100), apellidos varchar(100), fechaAlta date, fechaBaja date, repeticiones int)
    go
    Insert into dbo.losDatos (id, nombre, apellidos, fechaAlta, fechaBaja, repeticiones)
    values
    (1,'Ana','Pérez','2019-01-01',NULL,2),
    (2,'Carola','Sanz','2019-02-01','2019-12-31',3),
    (3,'Ismael','Sol','2018-07-15','2019-11-30',4),
    (4,'Sebastian','Ruiz','2019-01-01','2019-08-01',5),
    (5,'Isa','Rex','2019-01-01',NULL,6);
    go

    Con la tabla creada, vamos a crear una función de tipo tabla que nos devuelva un número por cada repetición.

    Create or alter function dbo.repetir (@id int)
    returns table
    return
    (With c as (
    	Select a From (values (1),(1))tbl (a))
    	, c2 as (Select 1 as n from c cross join c as b)
    	, c3 as (Select 1 as n from c2 cross join c2 as b)
    	, c4 as (Select 1 as n from c2 cross join c2 as b)
    	, c5 as (Select 1 as n from c2 cross join c2 as b)
    	, numerar as (Select row_number() over (order by (select null)) as myRow from c5)
    	Select top(@id) * from numerar
    );

    Esta es la salida de la función repetir para un 5.

    Ahora solo tenemos que usar la función.

    Select d.* from dbo.losDatos d
    	cross apply dbo.repetir (d.repeticiones) as fn

    Y el resultado es las filas repetidas tantas veces como indica la columna numero de repeticiones.

    id          nombre       apellidos    fechaAlta  fechaBaja  repeticiones
    ----------- ------------ ------------ ---------- ---------- ------------
    1           Ana          Pérez        2019-01-01 NULL       2
    1           Ana          Pérez        2019-01-01 NULL       2
    2           Carola       Sanz         2019-02-01 2019-12-31 3
    2           Carola       Sanz         2019-02-01 2019-12-31 3
    2           Carola       Sanz         2019-02-01 2019-12-31 3
    3           Ismael       Sol          2018-07-15 2019-11-30 4
    3           Ismael       Sol          2018-07-15 2019-11-30 4
    3           Ismael       Sol          2018-07-15 2019-11-30 4
    3           Ismael       Sol          2018-07-15 2019-11-30 4
    4           Sebastian    Ruiz         2019-01-01 2019-08-01 5
    4           Sebastian    Ruiz         2019-01-01 2019-08-01 5
    4           Sebastian    Ruiz         2019-01-01 2019-08-01 5
    4           Sebastian    Ruiz         2019-01-01 2019-08-01 5
    4           Sebastian    Ruiz         2019-01-01 2019-08-01 5
    5           Isa          Rex          2019-01-01 NULL       6
    5           Isa          Rex          2019-01-01 NULL       6
    5           Isa          Rex          2019-01-01 NULL       6
    5           Isa          Rex          2019-01-01 NULL       6
    5           Isa          Rex          2019-01-01 NULL       6
    5           Isa          Rex          2019-01-01 NULL       6

    Duplicar o repetir

    https://javifer2.wordpress.com/2019/10/27/duplicar-o-repetir-n-veces-n-registros/

    jueves, 7 de enero de 2021 6:07