es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Agrupar por y unir en MySQL.

Quiero obtener el total de la tabla “barpurchaserequest” agrupado por tipo de menú como “comida” y “bebida”. He intentado con la siguiente consulta:

SELECT  DISTINCT(b.name),
        0 as food_total,
        0 as drink_total,
        sum(ph.total) as total,
        sum(ph.gratuity) as gratuity
    from  branches b
    LEFT JOIN  drink_requests dr  ON b.id = dr.branch_id
    JOIN  drink_food df  ON df.id = dr.drink_id
    JOIN  bar_purchase_history ph  ON ph.request_id = dr.id
    GROUP BY  dr.branch_id;

Puedes verificar mi estructura de tabla como se muestra a continuación:

enter image description here

Estructura de la tabla ‘request’:

enter image description here

Estructura de la tabla de elementos del menú:

enter image description here

Quiero que mi resultado sea como se muestra a continuación:

enter image description here

Si alguien puede ayudar, por favor.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener el total de la tabla bar_purchase_request agrupado por el tipo de menú “comida” y “bebida”, debe modificar su consulta de la siguiente manera:

    SELECT  DISTINCT(b.name),
            COALESCE(SUM(CASE WHEN df.menu_type = 'food' THEN ph.total END), 0) as food_total,
            COALESCE(SUM(CASE WHEN df.menu_type = 'drink' THEN ph.total END), 0) as drink_total,
            sum(ph.total) as total,
            sum(ph.gratuity) as gratuity
        FROM branches b
        LEFT JOIN drink_requests dr ON b.id = dr.branch_id
        JOIN drink_food df ON df.id = dr.drink_id
        JOIN bar_purchase_history ph ON ph.request_id = dr.id
        GROUP BY b.id;
    

    Explicación:

    • Estamos usando la sentencia CASE dentro de la función SUM para calcular el total de cada tipo de menú por separado.
    • Estamos usando la función COALESCE para reemplazar los valores nulos por ceros.
    • Estamos agrupando los resultados por el id de la sucursal en lugar de la tabla drink_requests, y también eliminando la palabra clave DISTINCT.

    El resultado debería ser lo que está buscando:

    +------+------------+------------+-------+----------+
    | name | food_total | drink_total| total | gratuity |
    +------+------------+------------+-------+----------+
    | Abc  | 100.00     | 0.00       | 100.00| 15.00    |
    | Def  | 80.00      | 65.00      | 145.00| 20.50    |
    +------+------------+------------+-------+----------+
    

Comments are closed.