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

Duda sobre By group

Buenos dias estoy haciendo este ejercicio fui haciendo toda la consulta, hasta llegar al punto donde quiero que solo me muestre aquellos registros, donde los clientes se excedieron en el volumen de compra permitido en un 50 % o más. Todo va bien hasta que llego a la parte en la que quiero filtrar por el campo STATUS_VENTA quedandome con aquellos que dicen "Volumen excedido" y luego filtrando de esos casos aquellos que superan el 50%. Pero al hacerlo me arroja el siguiente error: Error Code: 1054. Unknown column 'STATUS_VENTA' in 'group statement'

Se que lo puedo resolver de otra forma haciendo que la diferencia entre volumen de venta y cantidad de negativo para los casos excedidos, pero lo que yo quiero entender es porque no me reconoce el campo STATUS_VENTA en la parte del WHERE, ya probe de varias formas, usando este campo en el By Group, poniendole A.STATUS_VENTA al llamarlo en el cuerpo del where, en fin mi error es conceptual por eso consulto.

Desde ya muchas gracias por su ayuda.

A continuacion dejo el codigo.

Saludos Analia

SELECT A.DNI, A.NOMBRE, A.FECHA, A.VOLUMEN_MAXIMO - A.CANTIDAD_VENDIDA AS DIFERENCIA, CASE WHEN(A.VOLUMEN_MAXIMO - A.CANTIDAD_VENDIDA) <= 0 THEN 'Volumen excedido' ELSE 'Volumen correcto' END AS STATUS_VENTA, ROUND((A.CANTIDAD_VENDIDA*100/ A.VOLUMEN_MAXIMO),2) AS PORCENTAJE FROM(SELECT TC.DNI, TC.NOMBRE, DATE_FORMAT(F.FECHA_VENTA, '%m -%Y') AS FECHA, SUM(Ifa.CANTIDAD) AS CANTIDAD_VENDIDA, MAX(TC.VOLUMEN_DE_COMPRA)/10 AS VOLUMEN_MAXIMO FROM tabla_de_clientes TC INNER JOIN facturas F ON TC.DNI = F.DNI INNER JOIN items_facturas Ifa ON F.NUMERO = Ifa.NUMERO GROUP BY TC.DNI, TC.NOMBRE, DATE_FORMAT(F.FECHA_VENTA, '%m -%Y'),STATUS_VENTA)A WHERE(STATUS_VENTA LIKE 'Volumen excedido' AND A.FECHA LIKE "%2018");

1 respuesta

Hola Analia, cómo va?

Entiendo tu problema. El error que estás viendo se debe a que estás intentando filtrar por el campo STATUS_VENTA en la cláusula WHERE, pero ese campo no es reconocido en esa parte de la consulta. Esto se debe a que la cláusula WHERE se ejecuta antes de la cláusula SELECT, por lo que no puede filtrar por un campo que se crea en la misma consulta.

Una forma de resolver esto es utilizando una cláusula HAVING en lugar de WHERE para filtrar por el campo STATUS_VENTA. La cláusula HAVING se utiliza para filtrar resultados después de haber realizado la agrupación, por lo que te permitirá filtrar por el campo calculado STATUS_VENTA.

Aquí te dejo un ejemplo de cómo podrías modificar tu consulta:

SELECT A.DNI, A.NOMBRE, A.FECHA, A.VOLUMEN_MAXIMO - A.CANTIDAD_VENDIDA AS DIFERENCIA,
    CASE 
        WHEN (A.VOLUMEN_MAXIMO - A.CANTIDAD_VENDIDA) <= 0 THEN 'Volumen excedido'
        ELSE 'Volumen correcto'
    END AS STATUS_VENTA, ROUND((A.CANTIDAD_VENDIDA*100/ A.VOLUMEN_MAXIMO),2) AS PORCENTAJE
FROM (
    SELECT TC.DNI, TC.NOMBRE, DATE_FORMAT(F.FECHA_VENTA, '%m -%Y') AS FECHA,
        SUM(Ifa.CANTIDAD) AS CANTIDAD_VENDIDA,
        MAX(TC.VOLUMEN_DE_COMPRA)/10 AS VOLUMEN_MAXIMO
    FROM tabla_de_clientes TC
    INNER JOIN facturas F ON TC.DNI = F.DNI
    INNER JOIN items_facturas Ifa ON F.NUMERO = Ifa.NUMERO
    GROUP BY TC.DNI, TC.NOMBRE, DATE_FORMAT(F.FECHA_VENTA, '%m -%Y')
) A
HAVING STATUS_VENTA = 'Volumen excedido' AND A.FECHA LIKE "%2018";

Al hacer este cambio, deberías poder filtrar los resultados por el campo STATUS_VENTA de la forma que necesitas.

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