Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

Descubrí que algo está mal con la respuesta dada por el equipo Alura

Ya que falta un registro en el resultado.
Esta es la consulta dada por el equipo Alura

SELECT 
    A.DNI, 
    A.NOMBRE, 
    A.MES_AÑO, 
    A.CANTIDAD_VENDIDA - A.CANTIDAD_MAXIMA AS DIFERENCIA,
    CASE
        WHEN  (A.CANTIDAD_VENDIDA - A.CANTIDAD_MAXIMA) <= 0 THEN 'Venta Válida'
        ELSE 'Venta Inválida'
    END AS STATUS_VENTA, 
    ROUND((1 - (A.CANTIDAD_MAXIMA/A.CANTIDAD_VENDIDA)) * 100,2) AS PORCENTAJE
FROM (
    SELECT 
        F.DNI, 
        TC.NOMBRE,
        DATE_FORMAT(F.FECHA_VENTA, "%m - %Y") AS MES_AÑO, 
        SUM(IFa.CANTIDAD) AS CANTIDAD_VENDIDA, 
        MAX(VOLUMEN_DE_COMPRA)/10 AS CANTIDAD_MAXIMA  
    FROM 
        FACTURAS F
    INNER JOIN 
        ITEMS_FACTURAS IFA
    ON 
        F.NUMERO = IFA.NUMERO
    INNER JOIN 
        TABLA_DE_CLIENTES TC
    ON
        TC.DNI = F.DNI
    GROUP BY
        F.DNI, 
        TC.NOMBRE, 
        DATE_FORMAT(F.FECHA_VENTA, "%m - %Y")) A
WHERE 
    (A.CANTIDAD_MAXIMA - A.CANTIDAD_VENDIDA) < 0 
    AND 
    ROUND((1 - (A.CANTIDAD_MAXIMA/A.CANTIDAD_VENDIDA)) * 100,2) > 50
    AND
    A.MES_AÑO LIKE "%2018";

Y este su resultado:
Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad
Comparto la consulta que yo hice:

SELECT
    A.*,
    ROUND((A.TOTAL_DE_PRODUCTOS_ADQUIRIDOS/A.LÍMITE_DE_COMPRA) * 100, 2) AS PORCENTAJE,
    ROUND(((A.TOTAL_DE_PRODUCTOS_ADQUIRIDOS/A.LÍMITE_DE_COMPRA) - 1) * 100, 2) AS DIFERENCIA_DE_PORCENTAJE
FROM (
    SELECT   
        ANY_VALUE(TC.NOMBRE) AS CLIENTE, 
        F.DNI,
        DATE_FORMAT(F.FECHA_VENTA, '%m - %Y') AS MES_AÑO,
        SUM(IFA.CANTIDAD) AS TOTAL_DE_PRODUCTOS_ADQUIRIDOS,
        ANY_VALUE(TC.VOLUMEN_DE_COMPRA)/10 AS LÍMITE_DE_COMPRA,
        SUM(IFA.CANTIDAD) - (ANY_VALUE(TC.VOLUMEN_DE_COMPRA)/10) AS DIFERENCIA,
        CASE
            WHEN SUM(IFA.CANTIDAD) < ANY_VALUE(TC.VOLUMEN_DE_COMPRA)/10 THEN 'Sí'
            ELSE 'No'
        END AS `¿VENTA VÁLIDA?`
    FROM
        FACTURAS F
    INNER JOIN
        ITEMS_FACTURAS IFA
    ON
        F.NUMERO = IFA.NUMERO
    INNER JOIN 
        TABLA_DE_CLIENTES TC
    ON
        F.DNI = TC.DNI
    GROUP BY
        F.DNI,
        DATE_FORMAT(F.FECHA_VENTA, '%m - %Y')) AS A
WHERE 
    A.MES_AÑO LIKE '%2018'
    AND
    ((A.TOTAL_DE_PRODUCTOS_ADQUIRIDOS/A.LÍMITE_DE_COMPRA)-1) * 100 > 50;

Y su resultado
Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad
Como podemos observar, en el resultado de la primer consulta falta la fila donde el cliente Jorge Castro, en Enero del 2018 compró 17,528 productos y se excedió por más del 80% de su límite permitido por mes.

ACTUALIZACIÓN

Descubrí el porqué del error de la primer consulta (la dada por el equipo Alura) y es que la fórmula dada para obtener el campo PORCENTAJE está mal planteada:

ROUND((1 - (A.CANTIDAD_MAXIMA/A.CANTIDAD_VENDIDA)) * 100,2)

Lo correcto es lo siguiente:

ROUND(((A.CANTIDAD_VENDIDA/A.CANTIDAD_MAXIMA)-1) * 100,2)
-- Cambiar la función ROUND() de las líneas 10 y 35 de la primer consulta por esta.

y así el problema se soluciona. Comparto el resultado con los cambios hechos.
Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

Puntos importantes a considerar en la consulta que desarrollé:

  1. El campo DIFERENCIA es la cantidad de productos adquiridos menos el límite de compra, así que tenemos dos posibles valores:
    • Si el resultado es positivo entonces eso indica la cantidad de productos adquiridos por la cual el cliente se excedió del límite de compra
    • Si el resultado es negativo entonces eso indica la cantidad de productos que le faltaron al cliente para llegar al límite de compra
  2. El campo DIFERENCIA_DE_PORCENTAJE también tiene dos posibles valores:
    • Si el resultado es positivo entonces eso indica el porcentaje por el cual el cliente se excedió del límite de compra
    • Si el resultado es negativo entonces eso indica el porcentaje que le faltó al cliente para excederse del límite de compra

Para ver en acción los dos puntos anteriores muestro el resultado de la consulta que desarrollé pero sin las dos última líneas:
Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad
NOTA FINAL:
Veo que en el foro hay dos versiones de la función ROUND y tomaré de ejemplo la consulta que desarrollé:

ROUND(((A.TOTAL_DE_PRODUCTOS_ADQUIRIDOS/A.LÍMITE_DE_COMPRA) - 1) * 100, 2)
-- Este es el que ocupé para la imagen anterior el cual es consistente

y

ROUND((1 - (A.TOTAL_DE_PRODUCTOS_ADQUIRIDOS/A.LÍMITE_DE_COMPRA)) * 100, 2)
-- Inconsistente
1 respuesta

CONTINUACIÓN
Ambas funciones ROUND() dan el mismo resultado pero con signo diferente y lo muestro a continuación:

La siguiente imagen es el resultado de usar la segunda función ROUND() la cual resulta inconsistente. Para que sea consistente se tendría que cambiar la definición del campo DIFERENCIA
Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad
PERO SI CAMBIAMOS EL CAMPO DIFERENCIA E INVERTIMOS LA RESTA
Pasamos de esto:

SUM(IFA.CANTIDAD) - (ANY_VALUE(TC.VOLUMEN_DE_COMPRA)/10 AS DIFERENCIA,

a esto:

(ANY_VALUE(TC.VOLUMEN_DE_COMPRA)/10) - SUM(IFA.CANTIDAD) AS DIFERENCIA,

Entonces es una opción mucho mejor:
Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad
Y ahora hacemos el análisis siguiente:

  1. El campo DIFERENCIA es el límite de compra menos la cantidad de productos adquiridos, así que tenemos dos posibles valores:
    *Si el resultado es positivo entonces eso indica la cantidad de productos que le faltaron al cliente para llegar al límite de compra
    *Si el resultado es negativo entonces eso indica la cantidad de productos adquiridos por la cual el cliente se excedió del límite de compra
  2. El campo DIFERENCIA_DE_PORCENTAJE, el cuál es, en esencia, 100% - el porcentaje de productos adquiridos con respecto al límite de compra, también tiene dos posibles valores:
    *Si el resultado es positivo entonces eso indica el porcentaje que le faltó al cliente para excederse del límite de compra
    *Si el resultado es negativo entonces eso indica el porcentaje por el cual el cliente se excedió del límite de compra