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:
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
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.
Puntos importantes a considerar en la consulta que desarrollé:
- 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
- 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:
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

