none
Quitar duplicados de una consulta RRS feed

  • Pregunta

  • Hola que tal, tengo la siguiente consulta a la cual quiero eliminarle valores duplicados:

    SELECT SUM(vdet_Cantidad) AS 'Piezas Vendidas', art_Clave AS 'SKU', art_Nombre  AS 'Descripción' FROM tVentaDetalle WHERE  (vdet_Fecha BETWEEN '01-01-2016' AND '01-02-2016') GROUP BY  art_Clave, art_Nombre HAVING SUM(vdet_Cantidad)>0 ORDER BY SUM(vdet_Cantidad)

    Lo anterior es equivalente también a lo siguiente:

    SELECT SUM(vdet_Cantidad) AS 'Piezas Vendidas', art_Clave AS 'SKU', art_Nombre  AS 'Descripción' FROM tVentaDetalle WHERE  (vdet_Fecha BETWEEN '01-01-2016' AND '01-02-2016') GROUP BY  art_Clave, art_Nombre 

    El problema es que me sigue mostrando valores duplicados, me refiero a lo siguiente:

    Si el código 23242526 tuvo 1000 ventas me las refleje en una sola columna y no me refleje dos veces 500.

    Espero una respuesta y MUCHAS GRACIAS.

    viernes, 23 de diciembre de 2016 18:42

Respuestas

  • Gspindola,

    Ambas consultas no retornan lo mismo, la primera consulta no retornará los productos cuya sumatoria de cantidades vendidas sea 0, ¿eso se da?, creo que es innecesario la expresión condicional.

    La cláusula GROUP BY agrupa las filas cuyo valor -en las columnas especificadas en la lista- contienen valores iguales, por tanto, si mencionas que el código XXXXXXX (contenido en la columna [art_Clave]) se repite dos o mas veces es porque probablemente el valor de la columna [art_Nombre] es distinto, ¿verdad?, ¿está permitido que para un mismo SKU se defina un nombre distinto? ¿es necesario la columna [art_Nombre] en la tabla [tVentaDetalle] siendo que sólo se debería persistir una referencia a la tabla [Productos] o como se llame?. Es claro que el problema se da porque tienes datos incoherentes y ya queda de ti -o del responsable- realizar la limpieza de datos correspondiente. La consulta final debería ser:

    SELECT 
        d.art_Clave AS 'SKU', 
        d.art_Nombre  AS 'Descripción',
        SUM(d.vdet_Cantidad) AS 'Piezas Vendidas'    
    FROM 
        tVentaDetalle d
    WHERE  
        d.vdet_Fecha BETWEEN '20160101' AND '20160131'    
    GROUP BY  
        d.art_Clave, d.art_Nombre 
    ORDER BY 
        [Piezas Vendidas];



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Gspindola viernes, 23 de diciembre de 2016 20:04
    viernes, 23 de diciembre de 2016 19:03

Todas las respuestas

  • Gspindola,

    Ambas consultas no retornan lo mismo, la primera consulta no retornará los productos cuya sumatoria de cantidades vendidas sea 0, ¿eso se da?, creo que es innecesario la expresión condicional.

    La cláusula GROUP BY agrupa las filas cuyo valor -en las columnas especificadas en la lista- contienen valores iguales, por tanto, si mencionas que el código XXXXXXX (contenido en la columna [art_Clave]) se repite dos o mas veces es porque probablemente el valor de la columna [art_Nombre] es distinto, ¿verdad?, ¿está permitido que para un mismo SKU se defina un nombre distinto? ¿es necesario la columna [art_Nombre] en la tabla [tVentaDetalle] siendo que sólo se debería persistir una referencia a la tabla [Productos] o como se llame?. Es claro que el problema se da porque tienes datos incoherentes y ya queda de ti -o del responsable- realizar la limpieza de datos correspondiente. La consulta final debería ser:

    SELECT 
        d.art_Clave AS 'SKU', 
        d.art_Nombre  AS 'Descripción',
        SUM(d.vdet_Cantidad) AS 'Piezas Vendidas'    
    FROM 
        tVentaDetalle d
    WHERE  
        d.vdet_Fecha BETWEEN '20160101' AND '20160131'    
    GROUP BY  
        d.art_Clave, d.art_Nombre 
    ORDER BY 
        [Piezas Vendidas];



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Gspindola viernes, 23 de diciembre de 2016 20:04
    viernes, 23 de diciembre de 2016 19:03
  • Muchas gracias por tu aportación Willams Morales es correcto, solo agregue una columna más para mostrar y me quedo de la siguiente manera:

    SELECT art_Clave AS 'SKU', art_Nombre  AS 'Descripción', SUM(vdet_Cantidad) AS 'Piezas Vendidas', SUM(vdet_Total) AS '$ Total' FROM tVentaDetalle WHERE (vdet_Fecha BETWEEN '01-01-2016' AND '01-02-2016') GROUP BY  art_Clave, art_Nombre ORDER BY [Piezas Vendidas]

     
    viernes, 23 de diciembre de 2016 19:42