1. #1
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2004
    Messages
    1 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2004
    Messages : 1 034
    Points : 1 305
    Points
    1 305

    Par défaut Simplification requête de calcul SUM

    Bonjour à tous!

    Je cherche à simplifier (et optimiser) une requête. Je précise que celle ci fonctionne, mais ne me semble pas très optimale niveau performance.

    Pour résumé j'ai une table produit, une table entree, une table sortie.
    Je veux réaliser une vue avec pour chaque produit, la somme des entrées/sorties.

    Voilà la requête que j'utilise actuellement (qui fonctionne bien). En gros je fais la somme des entrées, la somme des sorties puis la somme des deux résultats:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     SELECT id_produit, SUM(COALESCE(nbr_to_add, 0)) AS sum_entree_sortie
     FROM
     (
     
      SELECT p.id_produit, SUM(COALESCE(e.qty_entree, 0)) AS nbr_to_add
       FROM produit p
       LEFT JOIN entree e ON e.id_produit = p.id_produit
       GROUP BY p.id_produit
     
       UNION
     
      SELECT p.id_produit, SUM(COALESCE(s.qty_sortie, 0)) AS nbr_to_add
       FROM produit p
       LEFT JOIN sortie s ON s.id_produit = p.id_produit
       GROUP BY p.id_produit
     
     ) as entreesortie
       GROUP BY id_produit;
    Est-ce qu'a votre avis il y a moyen de l'optimiser / simplifier ? Je précise qu'il est compliqué de toucher à la structure des tables!

    Merci d'avoir lu ces lignes!
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    7 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 7 283
    Points : 22 030
    Points
    22 030

    Par défaut

    Peut-être déjà qu'utiliser UNION ALL à la place de UNION permettrait de supprimer une étape de tri et dédoublonnage inutile.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2004
    Messages
    1 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2004
    Messages : 1 034
    Points : 1 305
    Points
    1 305

    Par défaut

    OK, merci pour ce retour!
    je vais effectivement remplacer UNION par UNION ALL.
    Si il y a d'autres idées d'optimisation, je suis preneur!
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

  4. #4
    Rédacteur
    Avatar de SQLpro
    Homme Profil pro
    Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Inscrit en
    mai 2002
    Messages
    17 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert SGBDR & SQL, spécialiste Microsoft SQL Server
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 17 013
    Points : 39 495
    Points
    39 495
    Billets dans le blog
    1

    Par défaut

    Apparemment vous avez de la concurrence !!!! J'ai donné une autre réponse ici :
    https://www.developpez.net/forums/d1...e/#post9427419

    De mémoire il y a un bug avec le FULL OUTER JOIN dans PG... Voir s'il a été corrigé.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  5. #5
    Membre expérimenté
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mars 2004
    Messages
    1 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mars 2004
    Messages : 1 034
    Points : 1 305
    Points
    1 305

    Par défaut

    Merci pour ce retour !
    J'ai appliqué la solution FULL OUTER JOIN, mais je ne parvient pas aux bons résultats. Peut-être cela vient t'il du bug PostgreSQL...
    Par contre en essayant cette solution, et en réfléchissant un peu je suis parvenu à simplifier un peu ma requête. Je vais me satisfaire de ça pour l'instant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    SELECT id_produit, SUM(COALESCE(nbr_to_add, 0)) AS sum_entree_sortie
     FROM
     (
       SELECT p.id_produit, e.qty_entree AS nbr_to_add
       FROM produit p
       LEFT JOIN entree e ON e.id_produit = p.id_produit
     
       UNION ALL
     
       SELECT p.id_produit, s.qty_sorti AS nbr_to_add
       FROM produit p
       LEFT JOIN sortie s ON s.id_produit = p.id_produit
     
     ) as entreesortie
       GROUP BY id_produit;
    Merci à tous!
    Ce que l'on apprend par l'effort reste toujours ancré plus longtemps...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête pour calculer le temps entre deux dates
    Par Badboy62cfp dans le forum Access
    Réponses: 2
    Dernier message: 19/05/2006, 13h50
  2. Ma requête ne calcul pas pour tout les champs
    Par leloup84 dans le forum Requêtes
    Réponses: 10
    Dernier message: 01/03/2006, 12h59
  3. Ma requête ne calcul pas pour tout les champs
    Par leloup84 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/03/2006, 10h11
  4. [Debutant]Problème Requête et Calcul
    Par ghan77 dans le forum Bases de données
    Réponses: 9
    Dernier message: 04/01/2006, 14h47
  5. Fusionner 3 requêtes avec un SUM en une seule
    Par David Guillouet dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/07/2004, 15h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo