Principales respuestas
Query con valor acumulado

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
Respuestas
-
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
Todas las respuestas
-
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. -
-
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. -
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
-
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.
-
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
-
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.
-
-
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.
-
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
-
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
-
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
-
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.