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
    Nouveau Candidat au Club
    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

    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
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre éclairé
    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
    Nouveau Candidat au Club
    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 éclairé
    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

    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;

###raw>template_hook.ano_emploi###