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 :

Comparer une somme avec un max sur deux tables [10g]


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut Comparer une somme avec un max sur deux tables
    Bonjour a tous,
    je viens vers vous car je pèche sur une requête.
    voila la situation:
    je travail sous oracle 10
    j'ai 2 vues : dgP_actif et rnotation_actif avec comme colonnes tu_idnat et longtronc pour la première, bidnat et longtronc pour la deuxième.
    Je doit faire un comparatif entre ces deux table avec comme groupement le tu_idnat (identifiant commun avec bidnat mais non unique sur les deux tables).
    la comparaison est la somme par tu_idnat sur dgp_actif.longtronc avec le max de rnotation_actif.longtronc.

    Les requetes faites à part fonctionnent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select distinct tu_idnat, sum(longtronc) from dgp_actif group by tu_idnat order by tu_idnat;
    résultats:

    TU_IDNAT SUM(LONGTRONC)
    -------------------------------------------------- ----------------------
    TR00000000116072013152620TB000000001 162
    TR00000000116072013161006TB000000001 420

    CODE SQL 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select distinct bidnat, max(longtronc) from rnotation_actif group by bidnat order by bidnat;
    résultats:

    BIDNAT MAX(LONGTRONC)
    ---------------------------------------- ----------------------
    TR00000000116072013152620TB000000001 346
    TR00000000116072013161006TB000000001 420

    Le probleme est le resultat sur la somme de la colonne longtronc suivant:

    code sql:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select distinct d.tu_idnat, sum(d.longtronc),   max(r.longtronc)from dgp_actif d,rnotation_actif r where d.tu_idnat=r.bidnat  group by d.tu_idnat,r.bidnat order by d.tu_idnat;
    Résultats:

    TU_IDNAT SUM(D.LONGTRONC) MAX(R.LONGTRONC)
    -------------------------------------------------- ---------------------- ----------------------
    TR00000000116072013152620TB000000001 4050 346
    TR00000000116072013161006TB000000001 21000 420


    En espérant être assez clair.

    Merci d'avance pour l'aide.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Info : A partir du moment où tu fais un group by, le distinct est inutile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct tu_idnat, sum(longtronc) from dgp_actif group by tu_idnat order by tu_idnat;

    POur ton problème, tu peux faire comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT tu_idnat, sum(dgp), sum(rnot)
    FROM
    (select tu_idnat, sum(longtronc) dgp, NULL rnot FROM dgp_actif group by tu_idnat
    UNION ALL
    select bidnat, NULL dgp, max(longtronc) rnot FROM rnotation_actif group by bidnat)
    GROUP BY tu_idnat
    ORDER BY 1

  3. #3
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut
    Merci beaucoup,
    ton code fonctionne à merveille.
    Bonne journée

  4. #4
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut
    Maintenant que j'ai les bonnes valeurs, je souhaiterai faire un spool des lignes dont la différence entre max(rnot) et sum(dgp) est sup à 0

    le code suivant ne fonctionne pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    spool 2015_IQOATC_difference_long.txt;
     
    SELECT tu_idnat, sum(dgp), max(rnot),max(rnot)-sum(dgp) as dif
    FROM
    (select tu_idnat, sum(longtronc) dgp, NULL rnot FROM dgp_actif group by tu_idnat
    union all
    select bidnat, NULL dgp, max(longtronc) rnot FROM rnotation_actif  group by bidnat)
    where dif <> 0
    GROUP BY tu_idnat
    ORDER BY 1
    ;
    spool off;
    l'erreur est:
    Erreur SQL : ORA-00904: "DIF" : identificateur non valide

    d'avance merci

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    La clause WHERE est évaluée avant le SELECT, c'est pourquoi il ne retrouve pas l'alias "dif"

    Comme vous utilisez des fonctions d'agrégation ( MAX et SUM ici), utilisez HAVING au lieu de WHERE

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT tu_idnat, sum(dgp), sum(rnot)
    FROM
    (select tu_idnat, sum(longtronc) dgp, NULL rnot FROM dgp_actif group by tu_idnat
    UNION ALL
    select bidnat, NULL dgp, max(longtronc) rnot FROM rnotation_actif group by bidnat)
    GROUP BY tu_idnat
    HAVING sum(dgp) <> sum(rnot)
    ORDER BY 1
    Pour info, tu peux très bien faire des select sur des select, et ainsi avancer petit à petit (plus rapide pour faire des selects à la volée)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select *
    from (
    SELECT tu_idnat, sum(dgp) a, sum(rnot) b
    FROM
    (select tu_idnat, sum(longtronc) dgp, NULL rnot FROM dgp_actif group by tu_idnat
    UNION ALL
    select bidnat, NULL dgp, max(longtronc) rnot FROM rnotation_actif group by bidnat)
    GROUP BY tu_idnat
    )
    WHERE a <> b
    ORDER BY 1

  7. #7
    Membre habitué
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2015
    Messages : 9
    Par défaut
    Merci pour vos réponses
    et explications.
    C'est exactement ce que je voulais .



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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/01/2012, 11h58
  2. Selectionner une ligne avec un max sur plusieurs critères
    Par achestyx dans le forum Développement
    Réponses: 2
    Dernier message: 31/03/2011, 10h53
  3. Réponses: 2
    Dernier message: 26/11/2008, 09h43
  4. Une requête avec un Max sur 2 champs
    Par Bils dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/09/2007, 14h04

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