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 :

probleme de comparaison tabl1 vs tab2 oracle


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Avril 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 23
    Points : 13
    Points
    13
    Par défaut probleme de comparaison tabl1 vs tab2 oracle
    re bonjour ,
    j'ai un autre probleme la table 17 comporte bien des montant et de nombre ,par contre celle de 2018 ne comporte pas de données et quant j'execute le resultats me tourne rien (nulle enregistrement ) no rows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     select distinct 'produit' as pr
     , sum(s17.nombre) as "nbr 2017"
     , sum(s17.total_paye) as "mnt 2017"
     , sum(s18.nombre) as "nbr 2018" 
     , sum(s18.total_paye) as "mnt 2018" 
     , to_char(((1-sum(s17.nombre)/sum(s18.nombre))*100 ),'S9999D99')||'%' as "nbr %" 
     , to_char(((1-sum(s17.total_paye)/sum(s18.total_paye))*100),'S9999D99')||'%' as "mnt %"
     from recette_enr_sum_final_sysdate s18
     , recette_enr_sfinal_sysdate17 s17
     where s18.us_code_mere=s17.us_code_mere

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 084
    Points : 38 381
    Points
    38 381
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Plusieurs corrections et améliorations à apporter :
    • Pour faire une somme par produit, il manque une clause GROUP BY.
    • Pour faciliter la lecture, il est préférable de coder les jointures avec l'opérateur JOIN plutôt que dans le WHERE, la norme SQL a prévu cette améliOration depuis 1992 !
    • Faire des divisions sans s'assurer que le diviseur est différent de zéro est risqué, êtes vous certains que s18.nombre et s18.total_paye sont toujours > 0 ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Avril 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    j'ai visualiser les deux tables une seul table qu'est rempli l'autreest vide .
    la meme requette je l'ai executer en remplissant la 2eme table avec des donnée , ca marche

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 084
    Points : 38 381
    Points
    38 381
    Billets dans le blog
    9
    Par défaut
    Evidemment, c'est le principe même d'une jointure INNER : constituer l'intersection entre deux tables

    Or l'intersection de deux ensembles dont l'un est vide, est un ensemble... vide

    Si vous en êtes là, il serait bon de commencer par le commencement, à savoir la lecture des cours SQL et notamment des jointures que vous trouverez ici

    Citation Envoyé par 1227588 Voir le message
    j'ai visualiser les deux tables une seul table qu'est rempli l'autreest vide .
    la meme requette je l'ai executer en remplissant la 2eme table avec des donnée , ca marche
    Sans GROUP BY, ça m'étonnerait et n'oubliez pas de contrôler le diviseur avant de faire une division, sinon le plantage vous pend au nez...

  5. #5
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Sans GROUP BY, ça m'étonnerait et n'oubliez pas de contrôler le diviseur avant de faire une division, sinon le plantage vous pend au nez...
    Ici, "produit" est une chaine, donc une constante, group by n'est pas nécessaire.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Avril 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    je me connais un peu en sql le probleme qui se pose que la tab 1 et vide par contre la 2eme table est remplis de donnee quant je fait la comparaison et comme vous le voyer sur mon script precedement inserer ,j'ai selectioner le nbr pour les deux table est ca me sort rien et apres je fait comparer l'evolution la ca me sort encore rien car la 1 ere table est vide comment je vais faire pour me sortir la comparaison au moins me sort les donnée de la 1ere table

    svp

  7. #7
    Membre expérimenté Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Points : 1 597
    Points
    1 597
    Par défaut
    Il faut
    - faire une jointure externe
    - gérer dans la projection les cas où les sommes de nombre et de total paye de 2018 sont nulles

    ou ( notation spécifique Oracle )

    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 intermediate as ( select sum(s17.nombre)           as "nbr_2017"
                                , sum(s17.total_paye)       as "mnt_2017"
                                , sum(s18.nombre)           as "nbr_2018" 
                                , sum(s18.total_paye)       as "mnt_2018" 
                             from recette_enr_sum_final_sysdate s18
                                , recette_enr_sfinal_sysdate17 s17
                            where s18.us_code_mere (+) = s17.us_code_mere (+) )
    select 'produit'  pr
         , "nbr_2017"
         , "mnt_2017"
         , "nbr_2018" 
         , "mnt_2018" 
         , case when "nbr 2018" != 0 
                  then to_char(((1-"nbr_2017"/"nbr_2018")*100 ),'S9G999D99')||'%' 
                else null end        as "nbr %" 
         , case when "mnt 2018" !=0 
                  then to_char(((1-"mnt_2017"/"mnt_2018")*100),'S9G999D99')||'%'
                else null end        as "mnt %"
      from intermediate ;
    ou ( notation ANSI )

    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 intermediate as ( select sum(s17.nombre)           as "nbr_2017"
                                , sum(s17.total_paye)       as "mnt_2017"
                                , sum(s18.nombre)           as "nbr_2018" 
                                , sum(s18.total_paye)       as "mnt_2018" 
                             from recette_enr_sum_final_sysdate s18
                                  outer join recette_enr_sfinal_sysdate17 s17
                                     on s18.us_code_mere = s17.us_code_mere )
    select 'produit' pr
         , "nbr_2017"
         , "mnt_2017"
         , "nbr_2018" 
         , "mnt_2018" 
         , case when "nbr 2018" != 0 
                  then to_char(((1-"nbr_2017"/"nbr_2018")*100 ),'S9G999D99')||'%' 
                else null end        as "nbr %" 
         , case when "mnt 2018" !=0 
                  then to_char(((1-"mnt_2017"/"mnt_2018")*100),'S9G999D99')||'%'
                else null end        as "mnt %"
      from intermediate ;

  8. #8
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Avril 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    merci infinimenet le resultat de 2017 c'est afficher quant j'ai mis une jointure externe a le (+) , un autre probleme que je vien de le decouvert que le nbr et le montant sortis c n'est le nbr qd j'extrait le detail ,, qlq chose qui cloche j'ignore ou ca se passe .
    1 erement j'ai fait un select count(sur le nbr ca ma donner un nombre inferieur ce qu'est juste et avec la requettede jointure et tous ca donnee bcp trop
    svp help

  9. #9
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Ce que je te conseille : 2 select (1 par année) que tu regroupes pour avoir 1 ligne par code_mere.

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT us_code_mere, SUM(nbr18), SUM(mnt18), SUM(nbr17), SUM(mnt17)
    FROM ( 
     SELECT us_code_mere, SUM(nombre) nbr18, SUM(total_paye) mnt18, NULL nbr17, NULL mnt17
     FROM RECETTE_ENR_SUM_FINAL_SYSDATE 
     GROUP BY us_code_mere
    UNION ALL
    	SELECT us_code_mere, NULL nbr18, NULL mnt18, SUM(nombre) nbr17, SUM(total_paye) mnt17
     FROM RECETTE_ENR_SFINAL_SYSDATE17 
     GROUP BY us_code_mere
      )
    GROUP BY us_code_mere
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  10. #10
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Avril 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    ca marche parfaitement Mr mcm , et comment adapter avec ma requete avec le pourcentage et tous .

  11. #11
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Avril 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    voici ma requete je l'ai adapter avec lavotre masi ca amrche pas voir si j'ai commis un erreur svp .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT distinct  'pr'  as pr,
    SUM(DIP_TOTAL_enr_sysdate17.nombre) as "Nbr 2017", SUM(DIP_TOTAL_enr_sysdate17.total_paye) as "Mnt 2017",
    SUM(DIP_TOTAL_enr_sysdate.nombre) as "Nbr 2018"  ,SUM(DIP_TOTAL_enr_sysdate.total_paye) as "Mnt 2018" ,
    to_char(((1-sum(DIP_TOTAL_enr_sysdate17.nombre)/  Sum(DIP_TOTAL_enr_sysdate.nombre))*100 ),'S9999D99')||'%'          as "nbr %" ,
    to_char(((1-sum(DIP_TOTAL_enr_sysdate17.total_paye)/ Sum(DIP_TOTAL_enr_sysdate.total_paye))*100),'S9999D99')||'%'   as "mnt %"
    FROM (
     SELECT SUM(DIP_TOTAL_enr_sysdate.nombre) as "Nbr 2018"  ,SUM(DIP_TOTAL_enr_sysdate.total_paye) as "Mnt 2018" , 
     NULL SUM (DIP_TOTAL_enr_sysdate17.nombre) as "Nbr 2017" , NULL SUM(DIP_TOTAL_enr_sysdate17.total_paye) as "Mnt 2017"
     FROM DIP_TOTAL_enr_sysdate 
    UNION ALL
    	SELECT NULL SUM(DIP_TOTAL_enr_sysdate.nombre) as "Nbr 2018", NULL SUM(DIP_TOTAL_enr_sysdate.total_paye) as "Mnt 2018", 
    	SUM(DIP_TOTAL_enr_sysdate17.nombre) as "Nbr 2017", SUM(DIP_TOTAL_enr_sysdate17.total_paye) as "Mnt 2017"
     FROM DIP_TOTAL_enr_sysdate17 
    );

  12. #12
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Avril 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    voici la requet mais je sais pas comment adapter le pourcentage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    to_char(((1-sum(DIP_TOTAL_enr_sysdate17.nombre)/  Sum(DIP_TOTAL_enr_sysdate.nombre))*100 ),'S9999D99')||'%'          as "nbr %" ,
    to_char(((1-sum(DIP_TOTAL_enr_sysdate17.total_paye)/ Sum(DIP_TOTAL_enr_sysdate.total_paye))*100),'S9999D99')||'%'   as "mnt %"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT distinct  'pr'  as pr,
    SUM( Nbr2017), SUM( Mnt2017),
    SUM(Nbr2018 ) ,SUM( Mnt2018 )
     
    FROM (
     SELECT SUM(DIP_TOTAL_enr_sysdate.nombre) as Nbr2018  ,SUM(DIP_TOTAL_enr_sysdate.total_paye) as Mnt2018 ,
     
     NULL   Nbr2017, NULL  Mnt2017
     FROM DIP_TOTAL_enr_sysdate 
    UNION ALL
    	SELECT NULL  Nbr2018, NULL Mnt2018,
    	SUM(DIP_TOTAL_enr_sysdate17.nombre) as Nbr2017, SUM(DIP_TOTAL_enr_sysdate17.total_paye) as Mnt2017
     FROM DIP_TOTAL_enr_sysdate17 
    );

  13. #13
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Etant donné que la sous requête génère 4 colonnes Nbr2017, Mnt2017, Nbr2018, Mnt2018 sur 2 lignes, il suffit que tu fasses tes calculs sur ces colonnes.
    Remplace sum(DIP_TOTAL_enr_sysdate17.nombre) par sum( Nbr2017) etc..

    Et vire ce distinct qui sert à rien.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  14. #14
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Avril 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    comment je vais fair pour integrer le calcule de pourcentage ?
    voir mes deux calcul de pourcentage precedement envoyee .

  15. #15
    Membre à l'essai
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Avril 2018
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2018
    Messages : 23
    Points : 13
    Points
    13
    Par défaut
    c'est bon ca marche parfaitement c'est resolu .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT distinct  'pr'  as pr,SUM( Nbr2017), SUM( Mnt2017),SUM(Nbr2018 ) ,SUM( Mnt2018 ),
    to_char(((1-sum(Nbr2017)/  Sum(Nbr2018))*100 ),'S9999D99')||'%'          as "nbr  %" ,to_char(((1-sum(Mnt2017)/ Sum(Mnt2018))*100),'S9999D99')||'%'   as "mnt %"
    FROM
     (
     SELECT SUM(DIP_TOTAL_enr_sysdate.nombre) as Nbr2018  ,SUM(DIP_TOTAL_enr_sysdate.total_paye) as Mnt2018 ,
     NULL   Nbr2017, NULL  Mnt2017
     FROM DIP_TOTAL_enr_sysdate 
    UNION ALL
    SELECT NULL  Nbr2018, NULL Mnt2018,
    SUM(DIP_TOTAL_enr_sysdate17.nombre) as Nbr2017, SUM(DIP_TOTAL_enr_sysdate17.total_paye) as Mnt2017
     FROM DIP_TOTAL_enr_sysdate17 
     )

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

Discussions similaires

  1. [VBS]probleme ds comparaison de nombres
    Par zorba49 dans le forum VBScript
    Réponses: 9
    Dernier message: 24/05/2006, 17h43
  2. Problème script de chargement de données oracle
    Par nkongolo.m dans le forum Linux
    Réponses: 4
    Dernier message: 24/01/2006, 12h46
  3. [Dates] Probleme de comparaison de date
    Par mathieu77186 dans le forum Langage
    Réponses: 4
    Dernier message: 22/12/2005, 18h21
  4. Probleme de conception pour un update Oracle!
    Par vempiria dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/09/2005, 11h28
  5. [C#] Problème de récupération d'une procédure Oracle
    Par minnieBis dans le forum ASP.NET
    Réponses: 11
    Dernier message: 20/04/2004, 14h48

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