Esto lo descubrí porque al momento de ejecutar la consulta de la actividad 'Informe de ventas válidas #1':
SELECT
F.DNI AS DNI_CLIENTE,
DATE_FORMAT(F.FECHA_VENTA, '%m - %Y') AS MES_AÑO,
SUM(IFA.CANTIDAD) AS CANTIDAD_TOTAL_ADQUIRIDA
FROM
FACTURAS F
INNER JOIN
ITEMS_FACTURAS IFA
ON
F.NUMERO = IFA.NUMERO
GROUP BY
F.DNI,
DATE_FORMAT(F.FECHA_VENTA, '%m - %Y')
ORDER BY;
Resulta en 546 registros.
Y al ejecutar la consulta de esta actividad ('Informe de ventas válidas #2'):
SELECT
/* Dado que, para el resultado de esta consulta, el campo TC.NOMBRE
tiene un único valor en todos los registros de cada agrupamiento, entonces no importa cuál
escoja MySQL. Por lo tanto, y para evitar errores relacionados
con GROUP BY, se recomienda usar ANY_VALUE().
Lo mismo se aplica para el campo TC.VOLUMEN_DE_COMPRA */
ANY_VALUE(TC.NOMBRE) AS CLIENTE,
F.DNI,
DATE_FORMAT(F.FECHA_VENTA, '%m - %Y') AS MES_AÑO,
SUM(IFA.CANTIDAD) AS CANTIDAD_TOTAL_ADQUIRIDA,
ANY_VALUE(TC.VOLUMEN_DE_COMPRA)/10 AS VOLUMEN_DE_COMPRA,
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');
Resulta en 468 registros lo cual es inconsistente ya que debería devolver 546 registros (lo mismo que la primera consulta).
O sea, esta consulta es, en esencia, la misma que la primera pero con campos extra para hacer otro tipo de análisis (reporte).
Descubrí el porqué de esta inconsistencia y es que en la tabla de facturas hay DNIs que no existen en la tabla de clientes.
SELECT
DISTINCT F.DNI AS DNIs_FANTASMA
FROM
FACTURAS F
WHERE NOT EXISTS(
SELECT
1
FROM
TABLA_DE_CLIENTES TC
WHERE
F.DNI = TC.DNI);
SELECT
*
FROM
TABLA_DE_CLIENTES
WHERE
DNI IN('19290992743', '2600586709');

Por último, ¿Cuántos registros con esos DNIs fantasma hay en el resultado de la primera consulta?
SELECT
COUNT(*)
FROM (
SELECT
F.DNI,
DATE_FORMAT(F.FECHA_VENTA, '%m - %Y') AS MES_AÑO,
SUM(IFA.CANTIDAD) AS CANTIDAD_TOTAL_ADQUIRIDA
FROM
FACTURAS F
INNER JOIN
ITEMS_FACTURAS IFA
ON
F.NUMERO = IFA.NUMERO
WHERE
F.DNI IN('19290992743', '2600586709')
GROUP BY
F.DNI,
DATE_FORMAT(F.FECHA_VENTA, '%m - %Y')) AS X;
El resultado es 78 lo cual es la resta de 546 - 468.
Y esto tiene sentido ya que al ejecutar la segunda consulta se hace un INNER JOIN el cual se rige por FACTURAS.DNI = TABLA_DE_CLIENTES DNI y es aquí donde esos 78 registros no se muestran.
Para solucionar esta inconsistencia hay dos opciones:
- Agregar clientes con esos DNIs fantasma a la tabla de clientes
- Borrar los registros de la tabla de facturas que tengan asociados esos DNIs fantasma