none
OBTENER SUMA TOTAL DE LA MULTIPLICACIÓN DE LOS VALORES 2 COLUMNAS DE UNA TABLA CON RECURSIVIDAD RRS feed

  • Pregunta

  • Esto es lo que yo estaba haciendo

    create function valor_total(@contador int)
     returns int
     begin
    declare @producto int
     declare @total int
     set @producto=0
    select @producto=(select precio_producto*cantidad from electrodomesticos where id=@contador)
    if @contador=0
       select @total=0
    else
       select @total=dbo.valor_total(@contador-1)+@producto
    return @total
    end

    end

    end

    lo que pasa ahora es que descubrí un error,  cuando ejecuto el select dbo.valor_total(2), el número 2 quiere decir el número de filas que va a sumar luego de haber multiplicado los valores de 2 columnas en ambas filas, me explico, la primera fila tiene un valor precio=20 y cantidad=10, el producto sería 200, luego la segunda fila tiene precio=30 y cantidad=10, producto=300, suma total de ambas filas sería 500. Eso me da la función de arriba. Sin embargo, tengo como contador al "id", y ahí está el error, porque por ejemplo, si tengo 10 filas, genial, el código recorre fila por fila hasta llegar al 10, pero si es que borro una fila, quedarían 9, digamos que borro la fila 5, los ID de las filas serían (1,2,3,4,6,7,8,9,10), y es así como el resultado de la función me sale NULL, debido a que la función recorre fila por fila, y va de uno en uno, y como le falta la fila 5, no puede dar un resultado, porque no existe esa fila, y no puede seguir avanzando. Ahora, lo que yo quiero es saber qué otro procedimiento puedo usar utilizando "recursividad", para que me dé el resultado que quiero, que es la suma total de la multiplicación de 2 columnas de todas las filas existentes. Agradecería muchísimo la ayuda por favor, quiero seguir aprendiendo más por mi propia cuenta, por eso acudo a esta plataforma.


    henry


    • Editado HenryFo jueves, 22 de noviembre de 2018 23:52
    jueves, 22 de noviembre de 2018 23:31

Respuestas

Todas las respuestas

  • Hola HenryFo:

    Una posible opción es numerar las filas.

    Te pongo el script completo de creación:

    create table electrodomesticos( id int, precio_producto int, cantidad int)
    go
    insert into electrodomesticos (id, precio_producto, cantidad)
    values
    (1,100,12),
    (2,100,12),
    (3,100,12),
    (4,100,12),
    (6,100,12),
    (7,100,12),
    (8,100,12),
    (9,100,12),
    (10,100,12)
    go
    ;with cte as (
    	select ROW_NUMBER() over (order by id) as fila,
    			id,
    			precio_producto, 
    			cantidad
    			from electrodomesticos
    			)select fila,id, precio_producto, cantidad from cte;

    Como ves, se puede utilizar la función de ventana Row_number para numerar un conjunto de registros, en este caso ordenados por id.

    Row_number

    https://docs.microsoft.com/es-es/sql/t-sql/functions/row-number-transact-sql?view=sql-server-2017

    Tu función, podría ser entonces algo como esto:

    create function valor_total(@contador int)
     returns int
     begin
    declare @producto int
     declare @total int
     set @producto=0
    
    ;with cte as (
    	select ROW_NUMBER() over (order by id) as fila,
    			id,
    			precio_producto, 
    			cantidad
    			from electrodomesticos
    			)
    			select @producto=(precio_producto*cantidad) from cte where fila = @contador;
    
    if @contador=0
       select @total=0;
    else
       select @total=dbo.valor_total(@contador-1)+@producto;
    return @total;
    end
    
    

    De manera que a la salida de la tabla de expresión común, escogemos, la fila por su valor de variable @id, asígnandole, lo que corresponde a la variable @producto.

    Espero te sirva.

    viernes, 23 de noviembre de 2018 6:27
  • Suponiendo que no tienes valores negativos en la columna [id], entonces esta es la operacion que deseas hacer sin necesidad de recorrer la tabla una fila a la vez:

    declare @contador int = 10;

    select sum(cantidad * precio_producto) as total
    from electrodomesticos
    where id <= @contador;

    Por cierto, tu codigo se puede ajustar encerrando dentro la funcion ISNULL la sentencia donde calculas el producto:

    select @producto=ISNULL((select precio_producto*cantidad from electrodomesticos where id=@contador),0)

    Mi sugerencia es que uses una funcion tipo tabla en linea o que uses el codgo propuesto directamente.


    AMB

    Some guidelines for posting questions...

    AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas

    viernes, 23 de noviembre de 2018 13:37