Calculer chiffre d'affaire avec 2 tables - SQL

a marqué ce sujet comme résolu.

Bonjour à tous. J’ai besoin d’une petite aide/explication SQL SVP.

Pour résumé, pour faire des calculs de chiffre d’affaire, je fais la SUM des prix TTC de ces 2 tables : order_basket__product et order_basket__service

C’est une req SQL que je fais car je souhaite faire des stats de chiffres d’affaires mensuels (d’où le GROUP BY).

J’ai donc fait cette req SQL :

Afin de faciliter mon exemple, ici (dans les sous-requêtes) j’ai remplacé les SUM directement par des valeurs en dur, qui ici sont de 40.00 et de 41.00 :

SELECT
    for_shop_id AS shop_id,
    in_month AS dateForInMonth,
    SUM(sum_in_month) AS result_CA

FROM (
    
-- Augmenter result_CA avec somme des product_price_ttc des order_basket__product
    SELECT
        shops.id AS for_shop_id,
        DATE_FORMAT(order_basket__product.created_at,"%Y-%m") AS in_month,
        40.00 AS sum_in_month  -- ICI
    FROM order_basket__product
    INNER JOIN orders_baskets
        ON orders_baskets.id = order_basket__product.order_basket_id
    INNER JOIN orders
        ON orders_baskets.order_id = orders.id
    
    INNER JOIN shops
        ON orders.shop_id = shops.id
    WHERE YEAR(order_basket__product.created_at) = 2021
    GROUP BY
        for_shop_id,
        in_month

    UNION

    -- Augmenter result_CA avec somme des service_price_ttc des order_basket__service
    SELECT
        shops.id AS for_shop_id,
        DATE_FORMAT(order_basket__service.created_at,"%Y-%m") AS in_month,
        40.00 AS sum_in_month  -- ICI
    FROM order_basket__service
    INNER JOIN orders_baskets
        ON orders_baskets.id = order_basket__service.order_basket_id
    INNER JOIN orders
        ON orders_baskets.order_id = orders.id
    
    INNER JOIN shops
        ON orders.shop_id = shops.id
    WHERE YEAR(order_basket__service.created_at) = 2021
    GROUP BY
        for_shop_id,
        in_month

) alias_ignored

GROUP BY
    shop_id,
    dateForInMonth

Le problème : c’est qu’ici result_CA retourne 40.00 au lieux de 80.00

Et ici :

La seule différence par rapport à la req SQL de ci-dessus, c’est que j’ai remplacé 40.00 par 41.00 pour la somme de la table order_basket__product

SELECT
    for_shop_id AS shop_id,
    in_month AS dateForInMonth,
    SUM(sum_in_month) AS result_CA

FROM (
    
-- Augmenter result_CA avec somme des product_price_ttc des order_basket__product
    SELECT
        shops.id AS for_shop_id,
        DATE_FORMAT(order_basket__product.created_at,"%Y-%m") AS in_month,
        41.00 AS sum_in_month  -- ICI
    FROM order_basket__product
    INNER JOIN orders_baskets
        ON orders_baskets.id = order_basket__product.order_basket_id
    INNER JOIN orders
        ON orders_baskets.order_id = orders.id
    
    INNER JOIN shops
        ON orders.shop_id = shops.id
    WHERE YEAR(order_basket__product.created_at) = 2021
    GROUP BY
        for_shop_id,
        in_month

    UNION

    -- Augmenter result_CA avec somme des service_price_ttc des order_basket__service
    SELECT
        shops.id AS for_shop_id,
        DATE_FORMAT(order_basket__service.created_at,"%Y-%m") AS in_month,
        40.00 AS sum_in_month  -- ICI
    FROM order_basket__service
    INNER JOIN orders_baskets
        ON orders_baskets.id = order_basket__service.order_basket_id
    INNER JOIN orders
        ON orders_baskets.order_id = orders.id
    
    INNER JOIN shops
        ON orders.shop_id = shops.id
    WHERE YEAR(order_basket__service.created_at) = 2021
    GROUP BY
        for_shop_id,
        in_month

) alias_ignored

GROUP BY
    shop_id,
    dateForInMonth

Ici : result_CA retourne bien 81.00

Ce qui veut dire, que si sum_in_month de order_basket__product et sum_in_month de order_basket__service ont la même valeur, qu’ils ne s’additionnent pas…

Avez-vous une idée SVP ?

Merci d’avance.

Juste pour préciser pourquoi union all à la place de union, si ça peut servir à quelqu’un :

  • union all va concaténer les résultats des deux requêtes,
  • union va concaténer les résultats des deux requêtes en supprimant les lignes en double.

Et là on est dans le cas où on veut garder toutes les lignes, puisqu’on veut en faire une somme ensuite.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte