Principales respuestas
SUMAR el CAMPO y CONTAR cuantas veces se repite

Pregunta
-
Saludos Cordiales Amigos,
Soy completamente nuevo en estos foros, y decidí crear este por que no encuentro por ningún lado lo que deseo.
Les cuento mi problema, tengo una Base de Datos con la tabla Kardex con los siguientes campos:
CodigoProducto, DescripcionProducto, Cantidad, Documento, Fecha y etc.., lo que necesito es lo siguiente, que me sume la cantidad de productos por documento y que me cuente en cuantos documentos se repite por un rango de fechas, me explico con un ejemplo.
----------------------------------------------------------------------------------------------------------------------------------------------
CodigoProducto | DescripcionProducto | Cantidad | Documento | Fecha |
----------------------------------------------------------------------------------------------------------------------------------------------
001 | Producto A | 3 | Nota | 2017-01-02
002 | Producto B | 1 | Nota | 2017-01-02
001 | Producto A | 1 | Factura | 2017-01-03
002 | Producto B | 1 | Factura | 2017-01-02
001 | Producto A | 2 | Nota | 2017-01-02
002 | Producto B | 5 | Factura | 2017-01-02
Lo que necesito como resultado seria
----------------------------------------------------------------------------------------------------------------------------------------------
CodigoProducto | DescripcionProducto | Cantidad | Notas | Cantidad | Facturas | Fecha
----------------------------------------------------------------------------------------------------------------------------------------------
001 | Producto A | 5 | 2 | 1 | 1 | 2017-01-02 / 2017-01-31
002 | Producto B | 1 | 1 | 6 | 2 | 2017-01-02 / 2017-01-31
Tal vez sea algo sencillo pero no lo puedo realizar, he usado SUM y COUNT pero no logro que me visualice lo que deseo, espero que me puedan ayudar y también espero haber sido lo mas claro
Desde Ya Gracias por su ayuda....- Cambiado Enrique M. Montejo viernes, 11 de agosto de 2017 16:15 Pregunta relacionada con la sintaxis de una consulta SQL de selección.
Respuestas
-
- Consulta sql
SELECT k.CodigoProducto, k.DescripcionProducto, SUM(CASE WHEN k.Documento = 'Nota' THEN k.Cantidad END) AS CantidadN, COUNT(CASE WHEN k.Documento = 'Nota' THEN k.Cantidad END) AS Notas, SUM(CASE WHEN k.Documento = 'Factura' THEN k.Cantidad END) AS CantidadF, COUNT(CASE WHEN k.Documento = 'Factura' THEN k.Cantidad END) AS Facturas, STUFF((SELECT ' - ' + CONVERT(varchar(10), Fecha, 103) FROM Kardex WHERE k.CodigoProducto = CodigoProducto GROUP BY CONVERT(varchar(10), Fecha, 103) FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(4000)'), 1, 3, '') FROM Kardex k GROUP BY k.CodigoProducto, k.DescripcionProducto;
Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.- Marcado como respuesta Enrique M. Montejo viernes, 11 de agosto de 2017 16:14
Todas las respuestas
-
¿Intentas desarrollar el caso desde una consulta sql de selección? ¿o desde la aplicación?. Según sea la respuesta, debes indicar el gestor y versión de base de datos que ocupas, o si accedes a la base de datos mediante ADO .Net o algún ORM (en caso desees afrontar el caso desde la aplicación).
Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente. -
Saludos Willams Morales,
Desde un proyecto que realice en VB 6.0 que se conecta a SQL 2008R2 pero si me ayudas con la sentencia SQL no hay problema.
- Editado Pablo Jimenez miércoles, 9 de agosto de 2017 21:36
-
- Consulta sql
SELECT k.CodigoProducto, k.DescripcionProducto, SUM(CASE WHEN k.Documento = 'Nota' THEN k.Cantidad END) AS CantidadN, COUNT(CASE WHEN k.Documento = 'Nota' THEN k.Cantidad END) AS Notas, SUM(CASE WHEN k.Documento = 'Factura' THEN k.Cantidad END) AS CantidadF, COUNT(CASE WHEN k.Documento = 'Factura' THEN k.Cantidad END) AS Facturas, STUFF((SELECT ' - ' + CONVERT(varchar(10), Fecha, 103) FROM Kardex WHERE k.CodigoProducto = CodigoProducto GROUP BY CONVERT(varchar(10), Fecha, 103) FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(4000)'), 1, 3, '') FROM Kardex k GROUP BY k.CodigoProducto, k.DescripcionProducto;
Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.- Marcado como respuesta Enrique M. Montejo viernes, 11 de agosto de 2017 16:14
-
El mensaje del error es bastante claro respecto a la infracción que se comete, no puedes utilizar la función SUM() sobre valores de tipo nvarchar() que es el tipo que tienes asignado para la columna 'Cantidad', de hecho no es correcto, salvo que tu intención sea almacenar valores como: Uno, Tres, Quinientos cincuenta,... {sarcasm}.
Quita la última columna si no es de tu interés y convierte los valores de la columna de tipo nvarchar() a un tipo numérico entero.
SELECT k.CodigoProducto, k.DescripcionProducto, SUM(CASE WHEN k.Documento = 'Nota' THEN CONVERT(int, k.Cantidad) END) AS CantidadN, COUNT(CASE WHEN k.Documento = 'Nota' THEN CONVERT(int, k.Cantidad) END) AS Notas, SUM(CASE WHEN k.Documento = 'Factura' THEN CONVERT(int, k.Cantidad) END) AS CantidadF, COUNT(CASE WHEN k.Documento = 'Factura' THEN CONVERT(int, k.Cantidad) END) AS Facturas FROM Kardex k GROUP BY k.CodigoProducto, k.DescripcionProducto;
Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente. -
Saludos Willams,
Excelente tu aporte me sirvió bastante, si me di cuenta, de ese error, por eso supuestamente elimine esa consulta en el foro pero veo que te llego al correo, si gracias si me di cuenta de ese error, Perdón un lapsus de la emoción jajaja,
ahora tengo un dilema que no se por que no me reporta por el rango de fecha, tuve que modificar la sentencia que me diste:
SELECT
CodigoProducto, DescripcionProducto,
SUM(CASE WHEN Documento = 'Nota' THEN Cantidad END) AS CantidadN,
COUNT(CASE WHEN Documento = 'Nota' THEN Cantidad END) AS Notas,
SUM(CASE WHEN Documento = 'Factura' THEN Cantidad END) AS CantidadF,
COUNT(CASE WHEN Documento = 'Factura' THEN Cantidad END) AS Facturas
FROM
Kardex
WHERE
CATEGORIA = 'Tienda' and fecha BETWEEN 2017-06-01 AND 2017-06-31
GROUP BY
Codigo_item, Descripcion;--> En esta no me presenta nada de información y si tengo datos
SELECT
CodigoProducto, DescripcionProducto,
SUM(CASE WHEN Documento = 'Nota' THEN Cantidad END) AS CantidadN,
COUNT(CASE WHEN Documento = 'Nota' THEN Cantidad END) AS Notas,
SUM(CASE WHEN Documento = 'Factura' THEN Cantidad END) AS CantidadF,
COUNT(CASE WHEN Documento = 'Factura' THEN Cantidad END) AS Facturas
FROM
KardexWHERE
CATEGORIA = 'TIENDA' and fecha BETWEEN '20170601' AND '20170631'
GROUP BY
Codigo_item, Descripcion;--> En cambio en esta me da este error
Mens. 242, Nivel 16, Estado 3, Línea 1
La conversión del tipo de datos varchar en datetime produjo un valor fuera de intervalo.--> lo he probado de varias maneras, en el orden de la fecha por ejemplo, con el '>=', etc. pero el resultado es nulo no se me presenta...
¿A que se debe?
Gracias por tu ayuda...
-
Ambas formas van bien, no debes olvidar enmarcar el literal de fecha entre caracteres de apóstrofo ('20170630'), yo prefiero escribir literales de fecha bajo la segunda forma.
Respecto al mensaje de error: "La conversión del tipo de datos varchar en datetime produjo un valor fuera de intervalo", ¿nuevamente el mensaje del error no es claro respecto al problema?: el mes de junio trae consigo 30 días, no 31 días.
Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente. -
-
Estimado Willams,
Nuevamente te molesto, le estaba dando unos retoques a la sentencia para que el resultado no sea Null, si no un valor:
SELECT
CodigoProducto, DescripcionProducto,
SUM(CASE WHEN Documento = 'Nota' THEN Cantidad ELSE 0 END) AS CantidadN,
COUNT(CASE WHEN Documento = 'Nota' THEN Cantidad ELSE 0 END) AS Notas,
SUM(CASE WHEN Documento = 'Factura' THEN Cantidad ELSE 0 END) AS CantidadF,
COUNT(CASE WHEN Documento = 'Factura' THEN Cantidad ELSE 0 END) AS Facturas
FROM
Kardex
WHERE
CATEGORIA = 'Tienda' and fecha BETWEEN '20170301' AND '20170330'
GROUP BY
CodigoProducto, DescripcionProducto;--> Pero en productos que no tienen ventas en facturas el reporte es el mismo numero de Notas:
CodigoProducto DescripcionProducto CantidadN Notas CantidadF Facturas 46461313 Agua 90 66 0 66 5756753776 Café 4 4 0 4 --> La cuestión es que, como no se resetea el COUNT ¿Qué puedo hacer?
-
La respuesta que obtienes es de esperar porque la cuenta se realiza en cualquier caso, retira por favor la cláusula ELSE, la función COUNT() siempre retornará un valor, incluso 0.
SUM(CASE WHEN Documento = 'Nota' THEN Cantidad ELSE 0 END) AS CantidadN, COUNT(CASE WHEN Documento = 'Nota' THEN Cantidad END) AS Notas, --SUM(CASE WHEN Documento = 'Nota' THEN 1 ELSE 0 END) AS Notas,
Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente. -
Gracias Willams,
Tenía en mente mas o menos que eso era el problema... siempre tiene que devolver un valor...... con todo te agradezco muchísimo.....
“Para triunfar necesitas talento y mil cosas más, y son esas mil cosas más las que te harán triunfar”.