none
Sumar cantidades de una columna en una variable RRS feed

  • Pregunta

  • Hola! Buen día

    Tengo un procedimiento almacenado el cual hace una consulta SELECT con 6 campos. Hasta ahí todo está bien

    PONGO COMO EJEMPLO LA SIGUIENTE CONSULTA

    FECHA                     ACTIVO   NO_ROLLO  LARGO_YD   ID_ROLLO  PROGRAMADO

     2017-07-21                1            1234               7230        90              NULL

     2017-07-21                1            1235               7221        91              NULL

     2017-07-22                1            1236               7290        92              NULL

     2017-07-23                1            1237               7100        93              NULL

     2017-07-23                1            1238               6500        94              NULL


    Sin embargo, necesito que por medio de una condición se sume a una variable la columna de "LARGO_YD". He tratado con el siguiente código pero sin ningún éxito:

    DECLARE @SumaYardas decimal (18,2) =0.0

    if @cosumoTotalTela <= @SumaYardas

    BEGIN

    SET @SumaYardas = @SumaYardas + LARGO_YD

    END


    Para estar más en contexto, suponiendo que la variable "@consumoTotalTela" tiene un valor de 20,000, la variable "@SumaYardas" tendría que estar sumando las tres primeras filas de la columna antes mencionada.

    Agradezco de antemano sus respuestas


    lunes, 17 de julio de 2017 19:32

Respuestas

  • Hola Andres:

    Creo que en tu caso, sería mas efectivo, realizar un "while", y de pronto realizando un recorrido de las filas, teniendo como referencia una columna que identifique de manera única cada registro, pero que sea incremental (uno en uno), hasta que se cumpla con la condición del negocio.

    DECLARE @SumaYardas decimal (18,2) =0.0
    DECLARE @IdRollo bigint = 0;
    
    SELECT @IdRollo = MIN(ID_ROLLO) FROM <TU_RESULTADO_SELECT>;
    
    WHILE (@SumaYardas <= @cosumoTotalTela)
    BEGIN
        SELECT @SumaYardas = @SumaYardas + LARGO_YD FROM <TU_RESULTADO_SELECT> WHERE ID_ROLLO = @IdRollo;
        SET @IdRollo = @IdRollo + 1;
    END

    Saludos cordiales,


    Camilo Villa

    • Marcado como respuesta AndresSerna_11 miércoles, 19 de julio de 2017 18:32
    lunes, 17 de julio de 2017 22:28

Todas las respuestas

  • Hola Andres:

    Creo que en tu caso, sería mas efectivo, realizar un "while", y de pronto realizando un recorrido de las filas, teniendo como referencia una columna que identifique de manera única cada registro, pero que sea incremental (uno en uno), hasta que se cumpla con la condición del negocio.

    DECLARE @SumaYardas decimal (18,2) =0.0
    DECLARE @IdRollo bigint = 0;
    
    SELECT @IdRollo = MIN(ID_ROLLO) FROM <TU_RESULTADO_SELECT>;
    
    WHILE (@SumaYardas <= @cosumoTotalTela)
    BEGIN
        SELECT @SumaYardas = @SumaYardas + LARGO_YD FROM <TU_RESULTADO_SELECT> WHERE ID_ROLLO = @IdRollo;
        SET @IdRollo = @IdRollo + 1;
    END

    Saludos cordiales,


    Camilo Villa

    • Marcado como respuesta AndresSerna_11 miércoles, 19 de julio de 2017 18:32
    lunes, 17 de julio de 2017 22:28
  • Hola! Muchísimas gracias por su respuesta!

    En la parte donde dice que "TU_RESULTADO_SELECT" se refiere al query que utilizo para mostrar los datos mencionados al principio?

    Si es así, este es el query:

    SELECT TOP 10 MIN (CREADO) AS FECHA, ACTIVO, NO_ROLLO, LARGO_YD, ID_ROLLO, PROGRAMADO FROM TBL_INV_TELA AS TI
    WHERE ACTIVO = 1 AND EN_CORTE = 0 AND ID_TIPO_TELA = 160 
    GROUP BY NO_ROLLO, ACTIVO, LARGO_YD, ID_ROLLO, PROGRAMADO
    ORDER BY FECHA ASC

    Es en esa parte donde debo poner el query anterior?

    SALUDOS!!!

    lunes, 17 de julio de 2017 22:58
  • No me queda claro lo que intentas obtener, ¿las filas cuyo valor acumulado de la columna 'LARGO_YD' sea menor o igual a un valor en particular?

    DECLARE @ConsumoTotalTela decimal(9,2) = 20000;
    WITH R AS 
    (
        SELECT
    	   t1.FECHA, t1.ACTIVO, t1.NO_ROLLO, t1.LARGO_YD, t1.ID_ROLLO,
    	   SUM(LARGO_YD) OVER(ORDER BY t1.ID_ROLLO 
    		  ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS SUM_LARGO_YD
        FROM
    	   NombreTabla t1
    )
    SELECT * FROM R t1 
    WHERE t1.SUM_LARGO_YD <= @ConsumoTotalTela;
    GO


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 17 de julio de 2017 23:11
  • Hola! Muchas gracias por tu respuesta

    Lo que intento es mostrar los datos por medio de un query, eso ya está.

    El usuario manda un valor y se almacena en el parámetro @ConsumoTotalTela, ahora necesito saber cuantos rollos va a utilizar. Lo que había pensado era hacer una suma que se almacene en la variable @SumaYardas y condicionarlo a que si @ConsumoTotalTela <= @SumaYardas sin embargo no tuve éxito.

    Espero poder haberme dado a entender.

    SALUDOS!!

    lunes, 17 de julio de 2017 23:20
  • Sigues sin responder la pregunta, ¿deseas obtener un valor escalar con la sumatoria? ¿deseas agregar una nueva columna con el valor calculado?

    [...] Para estar más en contexto, suponiendo que la variable "@consumoTotalTela" tiene un valor de 20,000, la variable "@SumaYardas" tendría que estar sumando las tres primeras filas de la columna antes mencionada.

    Por lo mencionado entiendo que deseas recuperar un valor escalar con la sumatoria de yardas que permitan atender el pedido de tela, ¿verdad?, entonces el resultado que esperas es 21741, que resulta de la sumatoria de las tres primeras filas -tal como lo mencionas-.

    DECLARE @ConsumoTotalTela decimal(9,2) = 20000;
    WITH R AS 
    (
        SELECT	   
    	   SUM(LARGO_YD) OVER(ORDER BY t1.ID_ROLLO 
    		  ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS SUM_LARGO_YD,
    	   LEAD(LARGO_YD) OVER(ORDER BY t1.ID_ROLLO) AS NEXT_LARGO_YD
        FROM
    	   NombreTabla t1
    )
    SELECT 
        CASE 
    	   WHEN MAX(t1.SUM_LARGO_YD) = @ConsumoTotalTela THEN MAX(t1.SUM_LARGO_YD)
    	   ELSE MAX(t1.SUM_LARGO_YD) + MAX(NEXT_LARGO_YD)
        END
    FROM R t1 
    WHERE t1.SUM_LARGO_YD <= @ConsumoTotalTela;
    GO

    Por favor, ejecuta la consulta y coméntanos los resultados.

    En caso la propuesta no sea ni siquiera un acercamiento de lo que esperas te agradeceré seas explicito en el resultado que esperas, te recomiendo que te bases en los datos de ejemplo que has adjuntado para indicar de la misma manera los resultados que esperas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta AndresSerna_11 miércoles, 19 de julio de 2017 13:16
    • Desmarcado como respuesta AndresSerna_11 miércoles, 19 de julio de 2017 13:16
    lunes, 17 de julio de 2017 23:46
  • Hola! Muchas gracias!!

    Ejecuté esa consulta y efectivamente me da un resultado.

    Pero el detalle esta es que quiero que sume a partir de la consulta que realizo al principio, ya que si lo ejecuto tal cual, el proceso lo hace de toda la tabla y no exclusivamente de la consulta.

    miércoles, 19 de julio de 2017 14:11