none
Query con valor acumulado RRS feed

  • Pregunta

  • Hola, estoy tratando de hacer un query el cual me devuelva el valor acumulado de los registros que tengo en la tabla.

    Esta es la tabla

    Estoy haciendo este reporte en el cual muestro los datos que registro cada dia, por ejemplo el dia de hoy registre esta produccion.

    Lo que quiero es poner otro campo en el cual me muestre el acumulado de los productos, osea el campo cantidad me muestra lo que registre hoy y quiero que el otro campo me muestre la sumatoria de todo lo que ya he registrado.  Este es el query que tengo actualmente para hacer ese reporte

    SELECT SUM(dbo.PRODUCCION.CANTIDAD) AS Cantidad, dbo.PRODUCCION.CODIGO_PROD, dbo.PRODUCTO.DESCRIPCION,dbo.CATEGORIA.DESCRIPCION, dbo.PRODUCTO.ID_UNIDAD
    FROM dbo.PRODUCCION INNER JOIN
    dbo.PRODUCTO ON dbo.PRODUCCION.CODIGO_PROD = dbo.PRODUCTO.CODIGO INNER JOIN
    dbo.CATEGORIA ON dbo.PRODUCTO.ID_CATEGORIA = dbo.CATEGORIA.ID_CATEGORIA where PRODUCCION.REPORTE=@reporte
    GROUP BY dbo.PRODUCCION.CODIGO_PROD, dbo.PRODUCTO.DESCRIPCION, dbo.CATEGORIA.DESCRIPCION, dbo.PRODUCTO.ID_UNIDAD
    ORDER BY dbo.PRODUCCION.CODIGO_PROD

    sábado, 17 de septiembre de 2016 2:47

Respuestas

  • Argenis R R,

    Entonces debes de particionar por producto para que no acumule todos los valores.

    Te recomiendo que dejes sentencias sql de creación y de inserción de filas para recrear tu escenario y hacer pruebas, sin ello va a ser algo complicado dar con la solución, sólo vamos a especular.

    • Propuesto como respuesta HunchbackMVP lunes, 19 de septiembre de 2016 12:43
    • Marcado como respuesta Laura CeglzModerator miércoles, 21 de septiembre de 2016 20:04
    sábado, 17 de septiembre de 2016 5:20

Todas las respuestas

  • Argenis R R,

    Intenta ejecutar la siguiente consulta:

    WITH T AS 
    (
        SELECT     
    	   dbo.PRODUCCION.CODIGO_PROD AS 'Codigo', 
    	   dbo.PRODUCTO.DESCRIPCION AS 'DescProd',
    	   dbo.CATEGORIA.DESCRIPCION AS 'DescCateg', 
    	   dbo.PRODUCTO.ID_UNIDAD AS 'Unidad',
    	   SUM(dbo.PRODUCCION.CANTIDAD) AS 'Cantidad'
        FROM 
    	   dbo.PRODUCCION 
    	   INNER JOIN dbo.PRODUCTO ON dbo.PRODUCCION.CODIGO_PROD = dbo.PRODUCTO.CODIGO 
    	   INNER JOIN dbo.CATEGORIA ON dbo.PRODUCTO.ID_CATEGORIA = dbo.CATEGORIA.ID_CATEGORIA 
        WHERE 
    	   PRODUCCION.REPORTE = @reporte
        GROUP BY 
    	   dbo.PRODUCCION.CODIGO_PROD, dbo.PRODUCTO.DESCRIPCION, 
    	   dbo.CATEGORIA.DESCRIPCION, dbo.PRODUCTO.ID_UNIDAD
        ORDER BY 
    	   dbo.PRODUCCION.CODIGO_PROD
    )
    SELECT 
        Codigo, DescProd, DescCateg, Unidad, Cantidad, SUM(Cantidad) OVER (ORDER BY Codigo) 
    FROM 
        T;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 17 de septiembre de 2016 2:59
  • Me devuelve valores incorrectos en la sumatoria del acumulado. Me podrias explicar un poco esa consulta?
    sábado, 17 de septiembre de 2016 3:17
  • Argenis R R,

    Quizá yo entendí mal. Lo que hago es acumular las cantidades de una fila respecto a las filas anteriores. Por ejemplo:

    Cantidad   Acumulado
    10 .............. 10
    5  .............. 15
    3  .............. 18

    Se entiende que ese acumulado debes de agrupar con la herramienta de reporte que uses, si no es el caso te sugiero proporciones como es que tienes estructurado los datos y como esperas la salida.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 17 de septiembre de 2016 3:35
  • Algo así.. Por ejemplo en el mes de Julio, voy registrando producción,  si el día 1 hice 50 QQS de un producto y el día hago 100, quiero que en la columna producción del día me muestre los 100 del día 2 y en el acumulado 150, que seria la producción del día  1 y el día 2.



    • Editado Argenis R R sábado, 17 de septiembre de 2016 4:16 informacion erronea
    sábado, 17 de septiembre de 2016 3:54
  • Argenis R R,

    Te recomiendo que evites mostrar la estructura del reporte, sólo genera confusiones, estamos en una sección de SQL Server y el diseño de los reportes es un tema secundario.

    No demos muchas vueltas sobre el tema, centra los ejemplos sobre el caso puntual, en la consulta adjunta no hay ningún campo de fecha por el cuál agrupar las cantidades acumuladas, una vez más, muestra una estructura de datos real e indica la manera como tienes los datos y como es que esperas el resultado, soy pésimo adivinando.

    Las columnas que has mostrados son: CODIGO_PROD, DESCRIPCION_PROD, DESCRIPCION_CAT, ID_UNIDAD, CANTIDAD; coloca 5 filas de datos indicando claramente cuál es el resultado esperado.

    sábado, 17 de septiembre de 2016 4:06
  • La categoría solo la utilizo para poder agrupar los registros en el reporte y ponerlos separados.

    Fecha    01/01/2016    Producto alambre   cantidad 10  unidad qqs  reporte 000001

    Fecha    01/01/2016    Producto alambre1   cantidad 10  unidad qqs  reporte 000001

    Fecha    02/01/2016    Producto alambre   cantidad 10  unidad qqs  reporte 000002

    Fecha    02/01/2016    Producto alambre1   cantidad 20  unidad qqs  reporte 000002

    Resultado Esperado:

    Producto            Prod. del dia    Prod. Acu. del Mes     Unidad

    Alambre              10                      20                       QQS

    Alambre1            20                     30                       QQs


    sábado, 17 de septiembre de 2016 4:15
  • Argenis R R,

    La columna 'Acumulado' está bastante claro, sin embargo no entiendo la columna 'producto del día', ¿de qué día?, de ser así, deberían ser 4 filas, ¿verdad?, siendo 2 productos distintos por día.

    Lo siento, no entiendo lo que planteas, y en tanto no lo tenga claro no puedo hacer mucho por ayudarte.

    sábado, 17 de septiembre de 2016 4:37
  • Es "Produccion del dia", no producto. Si en el día de ayer produje 20 QQS de alambre y hoy produzco 30 QQS de alambre, quiero que en el campo Produccion del dia me muestre 30 y en el acumulado 50 que seria la suma de los dos dias.
    sábado, 17 de septiembre de 2016 4:53
  • Argenis R R,

    Pero lo que mencionas es lo que propuse en la primera consulta, te dejo el siguiente ejemplo:

    DECLARE @T Table (Fecha date, Producto nvarchar(100), Cantidad int, unidad nvarchar(100));
    INSERT INTO @T VALUES
    ('01/01/2016',' alambre', 20, 'qqs'),
    ('02/01/2016',' alambre', 30, 'qqs');
    SELECT
        t1.Producto,
        t1.Cantidad,
        SUM(t1.Cantidad) OVER(ORDER BY t1.Fecha)
    FROM
        @T t1;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.

    sábado, 17 de septiembre de 2016 5:06
  • Es que no es un solo producto, pueden ser 20, 50, etc. Cuando probé tu consulta al principio me suma el acumulado de un producto con el de otro producto diferente. Si fuese un solo producto si estaría correcta tu sentencia,

    Pude hacer lo que necesito con tablas temporales en un procedimiento almacenado, pero el problema ahora esta en que no puedo devolver esos datos a la aplicación, es como si estuviese vacia

    sábado, 17 de septiembre de 2016 5:11
  • Argenis R R,

    Entonces debes de particionar por producto para que no acumule todos los valores.

    Te recomiendo que dejes sentencias sql de creación y de inserción de filas para recrear tu escenario y hacer pruebas, sin ello va a ser algo complicado dar con la solución, sólo vamos a especular.

    • Propuesto como respuesta HunchbackMVP lunes, 19 de septiembre de 2016 12:43
    • Marcado como respuesta Laura CeglzModerator miércoles, 21 de septiembre de 2016 20:04
    sábado, 17 de septiembre de 2016 5:20
  • Willams,

    Al no poner la sub-clausula ROWS BETWEEN ..., SQL Server usa por defecto RANGE lo cual causa que el operador window spool del plan use tempdb. Te recomiendo que en estos casos siempre uses explicitamente la sub-clausula ROWS.

    ... over(order by t1.fecha rows unbounded preceding) as total_corriente

    o

    ... over(order by t1.fecha rows between unbounded preceding and current row) as total_corriente

    Ambas indican el mismo cuadro (frame).

    http://sqlmag.com/sql-server-2012/sql-server-2012-how-write-t-sql-window-functions-part-3


    AMB

    Some guidelines for posting questions...

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


    • Editado HunchbackMVP lunes, 19 de septiembre de 2016 14:30
    lunes, 19 de septiembre de 2016 12:42
  • Hunchback,

    Genial! Gracias por comentarlo y por la documentación respectiva, de hecho desconocía lo que mencionas respecto a enmarcar el frame explicitamente con ROWS.

    PDTA.- Gracias por las recomendaciones, te agradeceré (imagino que todos) nunca dejes de hacerlo.

    lunes, 19 de septiembre de 2016 16:28