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

SQL Oracle Discussion :

Différence entre deux tables


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut Différence entre deux tables
    salut j'ai un problème je cherche à faire la différence entre deux tables

    par exemple
    table1 avec deux champs code , montant qui contient
    A  1000
    B  900
    C  800
    D  700
    F  1500
    et table2
    A 100
    A 400
    A 200
    B 300
    B 100
    F 500
    F 400
    F 100
    alors avoir comme résultat

    A 300
    B 500 
    C 800
    D 700
    F 500
    merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    Quelles sont les requêtes que tu as déjà essayées ?
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Autrement dit, tu veux, pour chaque code, somme des montants de table1 - somme des montants de table2 ?

    Une jointure, un groupage pour calculer les sommes et le tout est joué !

    Tu essaies tout seul ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut
    bonjour

    je n'arrive pas à faire la différence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    SELECT Table1.code,
    Table1.[some],Table2.[some],
    (Table1.[some]-Table2.[some])
    FROM Table1 RIGHT JOIN Table2 ON Table1.code = Table2.code
    problème (Table1.[some]-sum (Table2.[some])) ne fonctionne pas je coince à faire la somme des lignes de meme code et puis faire différence entre deux table

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Tu n'as pas dû bien lire les liens que je t'ai donnés !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t1.code, SUM(t1.montant) - SUM(COALESCE(t2.montant, 0)) AS difference
    FROM table1 t1
    LEFT OUTER JOIN table2 t2 ON t2.code = t1.code
    GROUP BY t1.code
    J'ai ajouté le COALESCE au cas où il y aurait des codes de table1 qu'on ne retrouve pas dans table2.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut
    mais j'utilise SGBD oracle la requête ne fonctionne pas

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    C'est pourtant du SQL standard !

    Message d'erreur ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Ça va faire un simili produit cartésien comme ça Cinephil.
    Il faut faire l'agrégat avant la jointure :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    With Table1 as
    (
    select 'A' as code, 1000 as montant from dual union all
    select 'B'        ,  900            from dual union all
    select 'C'        ,  800            from dual union all
    select 'D'        ,  700            from dual union all
    select 'F'        , 1500            from dual
    )
      ,  Table2 as
    (
    select 'A' as code, 100 as montant from dual union all
    select 'A'        , 400            from dual union all
    select 'A'        , 200            from dual union all
    select 'B'        , 300            from dual union all
    select 'B'        , 100            from dual union all
    select 'E'        , 100            from dual union all -- petit rajout
    select 'F'        , 500            from dual union all
    select 'F'        , 400            from dual union all
    select 'F'        , 100            from dual
    )
      ,  t1_agg as
    (
      select code
           , sum(montant) as montant_tot
        from Table1
    group by code
    )
      ,  t2_agg as
    (
      select code
           , sum(montant) as montant_tot
        from Table2
    group by code
    )
      select coalesce(t1.code, t2.code) as code
           , coalesce(t1.montant_tot, 0) - coalesce(t2.montant_tot, 0) as montant
        from t1_agg t1
             full outer join t2_agg t2
               on t2.code = t1.code
    order by code asc;
     
    CODE MONTANT
    ---- -------
    A        300 
    B        500 
    C        800 
    D        700 
    E       -100 
    F        500

  9. #9
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ...
    SUM(COALESCE(t2.montant, 0))
    ne sert pas à grande chose: le marquer null n'est pas pris en compte dans SUM et autres fonctions agrégés (avec une exception). Par contre NVL(SUM(... peut être intéressant parfois.

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Citation Envoyé par mnitu Voir le message
    [code]ne sert pas à grande chose: le marquer null n'est pas pris en compte dans SUM et autres fonctions agrégés (avec une exception). Par contre NVL(SUM(... peut être intéressant parfois.
    Je ne vois pas la différence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL> with t as (
    select null as c from dual
    )
    select sum(coalesce(c,0)),
           coalesce(sum(c),0)
      from t;
     
    SUM(COALESCE(C,0)) COALESCE(SUM(C),0)
    ------------------ ------------------
                     0                  0
     
    SQL>

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Ce que veut dire mnitu, c'est plutôt à tester sur ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH t AS
    (
    SELECT NULL AS c FROM dual UNION ALL
    SELECT 1         FROM dual
    )
    SELECT sum(coalesce(c,0))
         , sum(c)
      FROM t;
    De surcroît appliquer coalesce avant de faire l'agrégat c'est une surcharge de travail

  12. #12
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par Waldar Voir le message
    ...
    De surcroît appliquer coalesce avant de faire l'agrégat c'est une surcharge de travail
    Et ça disqualifie un peu...

  13. #13
    Membre éclairé
    Inscrit en
    Avril 2007
    Messages
    679
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 679
    Par défaut
    bonsoir
    j'ai essayé de faire la différence entre deux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    select table1.num,table1.montant ,sum(table2),table1.montant-sum(table2.montant)as dif 
    from table1,table2
    where table2.num(+)=table1.num
    group by t1.num

    le problème avec sum(table2.montant) je veux si la sum égale 0 alors affiche '0.00'

    et même ,table1.montant-sum(table2.montant)as dif si sum(table2.montant)as alors affiche table1.montant au lieu rien

  14. #14
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 135
    Par défaut
    Quelle version d'Oracle utilises-tu ?
    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.

Discussions similaires

  1. Différence entre deux tables
    Par fabricedallara dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 24/05/2012, 14h31
  2. MINUS et Différence entre deux tables
    Par thegreatbato dans le forum SQL
    Réponses: 19
    Dernier message: 27/03/2008, 17h16
  3. Afficher la différence entre deux tables
    Par MartinezGarcia dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/02/2008, 20h25
  4. Différence entre deux tables
    Par szoubir dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 24/07/2007, 18h41
  5. faire une différence entre deux tables
    Par geay dans le forum Langage SQL
    Réponses: 1
    Dernier message: 04/09/2006, 15h33

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