none
SUMAR el CAMPO y CONTAR cuantas veces se repite RRS feed

  • 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.
    miércoles, 9 de agosto de 2017 17:30

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.
    miércoles, 9 de agosto de 2017 23:22

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.
    miércoles, 9 de agosto de 2017 18:37
  • 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.


    miércoles, 9 de agosto de 2017 21:32
  • - 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.
    miércoles, 9 de agosto de 2017 23:22
  • 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.
    jueves, 10 de agosto de 2017 15:50
  • 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
        Kardex

    WHERE

    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...

    jueves, 10 de agosto de 2017 17:28
  • 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.
    jueves, 10 de agosto de 2017 17:51
  • Estimado Willams,

    Excelente, gracias por tu valiosa ayuda e información. 

    jueves, 10 de agosto de 2017 18:37
  • 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?

    jueves, 10 de agosto de 2017 19:36
  • 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.
    jueves, 10 de agosto de 2017 21:46
  • 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”.

    jueves, 10 de agosto de 2017 22:45