IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Simplification requête de calcul SUM [8.4]


Sujet :

Requêtes PostgreSQL

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    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
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    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 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    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 bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    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...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Points : 1 307
    Points
    1 307
    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