Me pareció muy bueno el ejercicio, pero a raíz de una diferencia con uno de los registros empecé a mirar más detalladamente.
Me parece que el % con el que se filtran los resultados está invertido: En la resolución se indica en el WHERE final esta cláusula
ROUND((1 - (A.CANTIDAD_MAXIMA/A.CANTIDAD_VENDIDA)) * 100,2)
Pero debería ser
ROUND((1 - (A.CANTIDAD_VENDIDA/A.CANTIDAD_MAXIMA)) * 100,2)
Esto se debe a que el 100% que se debería tomar es el límite de ventas máximas permitidas que sale del volumen de compras.
Es decir de la manera en la que está resuelto, el volumen que representa el 100% es lo que se vendió, de manera que hay un caso donde se vende por encima de un 50% adicional al límite máximo que no sale con la resolución propuesta.
¿Les pasa lo mismo?
Esta es la solución a la que llegué yo donde agrego algunas columnas para que se vean las ventas, el límite y la diferencia:
SELECT A.DNI, A.NOMBRE, A.MES_AÑO, CONCAT(ROUND((100*(A.CANTIDAD_VENDIDA - A.CANTIDAD_MAXIMA)/A.CANTIDAD_MAXIMA),1), ' %') AS DIFERENCIA_PORCENTUAL,
A.CANTIDAD_VENDIDA, A.CANTIDAD_MAXIMA, A.CANTIDAD_VENDIDA - A.CANTIDAD_MAXIMA AS DIFERENCIA_NUMERICA,
CASE
WHEN A.CANTIDAD_VENDIDA - A.CANTIDAD_MAXIMA < 0 THEN 'Venta Válida'
ELSE 'Venta Inválida'
END AS STATUS_VENTA
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 MES_AÑO LIKE '%2018' AND (A.CANTIDAD_VENDIDA - A.CANTIDAD_MAXIMA)/A.CANTIDAD_MAXIMA > 0.5;
Acá dejo la resolución propuesta en la clase con columnas adicionales también para ver lo que indico:
SELECT A.DNI, A.NOMBRE, A.MES_AÑO,
A.CANTIDAD_VENDIDA - A.CANTIDAD_MAXIMA AS DIFERENCIA,
A.CANTIDAD_VENDIDA, A.CANTIDAD_MAXIMA,
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";