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

Langage SQL Discussion :

Comparaison résultats de 2 requêtes


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2020
    Messages : 16
    Points : 17
    Points
    17
    Par défaut Comparaison résultats de 2 requêtes
    Bonjour,

    Requête 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT matricule, sum(montant)
    from xxx
    where condition 1, ...
    group by matricule;
    Requête 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT matricule, sum(montant)
    from xxx
    where condition 2, ...
    group by matricule;
    Je voudrais voudrais faire une seule et même requête avec en résultat en colonne :
    - Matricule
    - Sum(montant) de la requête 1
    - Sum(montant) de la requête 2
    - Sum(montant) de la requête 1 - Sum(montant) de la requête 2

    et si possible n'afficher que les matricules pour lesquels il y a un écart et afficher l'écart.

    Je vous remercie d'avance pour votre retour.
    Merci !

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Bonjour et bienvenue sur DVP !

    Sans avoir essayé, tu peux essayer un truc de ce genre pour la réunion des deux requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT matricule,
        SUM(CASE
            WHEN condition 1 THEN montant
        END) AS somme_condition1,
        SUM(CASE
            WHEN condition 2 THEN montant
        END) AS somme_condition2
    FROM xxx
    GROUP BY matricule
    Et si ça fonctionne, tu peux ensuite faire ceci pour avoir la différence et ne conserver que les matricules présentant une différence :
    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
    SELECT t.matricule, t.somme_condition1, t.somme_condition2, 
        t.somme_condition1 - somme_condition2 AS difference
    FROM
    (
        SELECT matricule,
            CASE
                WHEN condition 1 THEN SUM(montant)
                ELSE 0
            END AS somme_condition1,
            CASE
                WHEN condition 2 THEN SUM(montant)
                ELSE 0
            END AS somme_condition2
        FROM xxx
        GROUP BY matricule
    ) t
    WHERE t.somme_condition1 <> somme_condition2

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 152
    Points : 1 939
    Points
    1 939
    Par défaut
    Bonjour,

    Il faut faire une requête du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH v AS (
     
    SELECT matricule, sum(CASE WHEN condition 1 THEN montant ELSE 0 END) as montant1, sum(CASE WHEN condition 2 THEN montant ELSE 0 END) as montant2
    from xxx
    where condition 1 ET condition 2, ...
    group by matricule
    )
    select matricule, montant1, montant2, montant1-montant2 as ecart
    from
    v
    where montant1-montant2 <> 0;

  4. #4
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Octobre 2020
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Octobre 2020
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Merci beaucoup mais j'ai un peu de mal ...

    J'ai ces deux requêtes :

    Requête 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select b.matric,sum(monsal)
    from hr.ZX00 a, hr.ZX8K b
    where a.nudoss = b.nudoss
    and a.perpai = b.perpai
    and b.codrub in ('INE','INO')
    and b.perpai in ('MT202001','MT202002')
    group by b.matric;

    Requête 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select matcle,sum(montan)
    from hr.ZYSR a, hr.ZY00 b
    where a.nudoss = b.nudoss
    and a.codrub = 'RVS'
    group by b.matcle;
    Du coup ce la donne quoi ?

  5. #5
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 152
    Points : 1 939
    Points
    1 939
    Par défaut
    Ok dans ton 1er message on aurait pu croire que les tables sources étaient les mêmes pour les 2 requêtes (puisque tu mettais "from xxx"). Là il faut joindre les 2 requêtes sur le matricule:

    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
    19
    with v1 as 
    (select b.matric,sum(monsal) as montant
    from hr.ZX00 a, hr.ZX8K b
    where a.nudoss = b.nudoss
    and a.perpai = b.perpai
    and b.codrub in ('INE','INO')
    and b.perpai in ('MT202001','MT202002')
    group by b.matric),
    v2 as
    (select matcle,sum(montan) as montant
    from hr.ZYSR a, hr.ZY00 b
    where a.nudoss = b.nudoss
    and a.codrub = 'RVS'
    group by b.matcle
    )
    select v1.matric, v1.montant, v2.montant, v1.montant - v2.montant as ecart
    from v1 
    join v2 on v1.matric = v2.matcle
    where v1.montant <> v2.montant;
    C'est une jointure interne, mais faut-il montrer les matricules non trouvés dans l'une ou l'autre requête?

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Je préfère la version avec UNION ALL, souvent plus performante :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    with cte_union_all as
    (
      select b.matric
           , sum(monsal) as montant_v1
           , 0           as montant_v2
        from hr.ZX00 a
        join hr.ZX8K b  on b.nudoss = a.nudoss
                       and b.perpai = a.perpai
       where b.codrub in ('INE', 'INO')
         and b.perpai in ('MT202001', 'MT202002')
    group by b.matric
       union all
      select matcle
           , 0           as montant_v1
           , sum(montan) as montant_v2
        from hr.ZYSR a
        join hr.ZY00 b on b.nudoss = a.nudoss
       where a.codrub = 'RVS'
    group by b.matcle
    )
      select matric
           , sum(montant_v1) as montant_v1
           , sum(montant_v2) as montant_v2
           , sum(montant_v1)
           - sum(montant_v2) as diff
        from cte_union_all
    group by matric;

Discussions similaires

  1. [11g] Comparaison de résultat de sous requêtes
    Par JeanYvette dans le forum SQL
    Réponses: 3
    Dernier message: 14/06/2018, 11h45
  2. [..] Comparaison des résultats de 2 requêtes SQL
    Par cyrus87 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/05/2015, 08h47
  3. Résultat d'une requête dans une variable...
    Par Hoegaarden dans le forum Bases de données
    Réponses: 6
    Dernier message: 28/04/2004, 13h51
  4. Résultat d'une requète SQL
    Par camino dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/02/2004, 15h22
  5. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26

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