Solucionado (ver solución)
Solucionado
(ver solución)
2
respuestas

[Duda] Error en la solución del ejercicio dada por el profesor.

Hola. Realicé el ejercicio pero cuando lo comparé con el del profesor, resulta que la respuesta dada por el profesor me generaba un error, especificamente este:

18:47:14 SELECT CONCAT('El cliente ', TC.NOMBRE, ' facturó ', CONVERT(SUM(IFa.CANTIDAD * IFa.precio), CHAR(20)) , ' en el año ', CONVERT(YEAR(F.FECHA_VENTA), CHAR(20))) AS FRASE FROM facturas F INNER JOIN items_facturas IFa ON F.NUMERO = IFa.NUMERO INNER JOIN tabla_de_clientes TC ON F.DNI = TC.DNI WHERE YEAR(FECHA_VENTA) = 2016 GROUP BY TC.NOMBRE, YEAR(FECHA_VENTA) LIMIT 0, 1000 Error Code: 1055. Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'jugos_ventas.F.FECHA_VENTA' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 0.000 sec

Estuve buscando la manera de corregir el error, pero no entendí la razón por la cuál funciona y la respuesta del profesor no.

La solución es simplemente quitar la función YEAR() del Group by y poner el campo FECHA_VENTA solo. De esta manera ya funciona. Estuve buscando una explicación ya que anteriormente ya había tenido este inconveniente cuando intentaba poner en el group by una función como YEAR(). Por favor, si alguien puede explicarme de manera simple esto, le agradecería mucho.

Por otro lado, esta fue mi respuesta al ejercicio(Solo para compartir): select concat("El cliente ", NOMBRE, " facturó " , CONVERT(SUM(CANTIDAD*PRECIO),CHAR(20)), " en el año 2016.")AS ANUNCIO from tabla_de_clientes CL inner join facturas FAC on CL.DNI = FAC.DNI inner join items_facturas IFAC on IFAC.NUMERO = FAC.NUMERO group by NOMBRE;

2 respuestas
solución!

¡Hola Hernán! Por lo que entendí es que estás teniendo un problema con la solución dada por el profesor en el ejercicio y te generó un error. El error que estás obteniendo se debe a que estás utilizando la función YEAR() en la cláusula GROUP BY, lo cual no está permitido en algunas configuraciones de MySQL.

La razón por la cual funciona cuando quitas la función YEAR() del GROUP BY y solo pones el campo FECHA_VENTA es porque el campo FECHA_VENTA es funcionalmente dependiente de los campos que estás agrupando (NOMBRE y YEAR(FECHA_VENTA)). En otras palabras, cuando agrupas por NOMBRE y YEAR(FECHA_VENTA), ya estás agrupando por el año de la fecha de venta.

Para explicarlo de manera más sencilla, cuando utilizas la función YEAR() en el GROUP BY, estás agrupando por el año de la fecha de venta y también por el campo FECHA_VENTA en sí. Esto causa una incompatibilidad con el modo de SQL "only_full_group_by" y genera el error que estás viendo.

Al quitar la función YEAR() del GROUP BY y solo poner el campo FECHA_VENTA, estás agrupando solo por el campo FECHA_VENTA y obteniendo el resultado deseado.

Aquí te dejo la solución corregida para que puedas compararla con la respuesta del profesor:

SELECT CONCAT('El cliente ', TC.NOMBRE, ' facturó ', CONVERT(SUM(IFa.CANTIDAD * IFa.precio), CHAR(20)), ' en el año 2016') AS FRASE 
FROM facturas F 
INNER JOIN items_facturas IFa ON F.NUMERO = IFa.NUMERO 
INNER JOIN tabla_de_clientes TC ON F.DNI = TC.DNI 
WHERE YEAR(F.FECHA_VENTA) = 2016 
GROUP BY TC.NOMBRE, F.FECHA_VENTA 
LIMIT 0, 1000;

Espero que esta explicación te haya ayudado a entender la razón detrás del error y la solución. Si tienes alguna otra pregunta, no dudes en preguntar. :)

Si este post te ayudó, por favor, marca como solucionado ✓.

Buenas!

Poner F.FECHA_VENTA sin la funcion year() en la parte de agrupación es un error, porque separará por hora, día y mes.

Yo lo había hecho así:

SELECT concat('El cliente ', NOMBRE, ' facturó ', 
round(sum(CANTIDAD * PRECIO)), ' en el año 2016') AS "Facturación de cliente"
FROM tabla_de_clientes TC
INNER JOIN facturas F ON TC.DNI = F.DNI
INNER JOIN items_facturas IFa ON IFa.NUMERO = F.NUMERO
WHERE year(FECHA_VENTA) = 2016
GROUP BY NOMBRE;

También busque como corregir el codigo del profesor:

SELECT CONCAT('El cliente ', TC.NOMBRE, ' facturó ', 
CONVERT(SUM(IFa.CANTIDAD * IFa.precio), CHAR(20))
 , ' en el año ', CONVERT(MAX(YEAR(F.FECHA_VENTA)), CHAR(20))) AS FRASE FROM facturas F
INNER JOIN items_facturas IFa ON F.NUMERO = IFa.NUMERO
INNER JOIN tabla_de_clientes TC ON F.DNI = TC.DNI
WHERE YEAR(FECHA_VENTA) = 2016
GROUP BY TC.NOMBRE, YEAR(FECHA_VENTA);

En mi opinión tiene bastante código innecesario.

ChatGPT: "La necesidad de agregar MIN o MAX en la columna F.FECHA_VENTA en la cláusula SELECT se debe a la configuración sql_mode=only_full_group_by en MySQL. Esta configuración es una medida de seguridad para garantizar que las consultas de agregación sean consistentes y predecibles, y cumple con los estándares SQL. "

Saludos!