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 :

Requête personnalisée


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2013
    Messages : 19
    Points : 8
    Points
    8
    Par défaut Requête personnalisée
    Bonjour

    Dans une BDD Oracle j'ai deux tables :
    Table 1 : COMP_HIS avec les colonnes nom_mat ;nom_tail

    Table 2 : COMP_PRIX _STD avec les colonnes nom_mat ;nom_tail ; prix_ind ; date_eff

    je veut récupérer les colonnes nom_mat ;nom_tail du premiere table avec le prix_ind de la deuxième table en utilisant un left join , le problème c'est que la table 2 contient plusieurs prix_ind selon la date_eff et parfois une même date_eff pour une seule matière . voila ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select his.nom_mat,his.nom_tail ,pri.prix_ind 
     
    From COMP_HIS his left join comp_prix_std pri on his.nom_mat=pri.nom_mat and nvl(his.nom_tail,'0')=nvl(pri.nom_tail,'0')  
     
    Where  ((select distinct max(date_eff) from comp_prix_std  where nom_mat=his.nom_mat and nvl(nom_tail,'0')=nvl(his.nom_tail,'0')) = pri.date_eff)

    le résultat donne des doublons si la date_eff d'une matière est en double.


    Merci de m'aider a résoudre ce problème .

    NB : la requête est beaucoup plus compliqué que ça mais j'ai présenter seulement les colonnes qui pose problèmes .

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 805
    Points
    30 805
    Par défaut
    Citation Envoyé par killerinstinct Voir le message
    le problème c'est que la table 2 contient plusieurs prix_ind selon la date_eff et parfois une même date_eff pour une seule matière.
    Il faut commencer par résoudre fonctionnellement ce problème avant de chercher la solution technique.
    La question est : Dans ce cas particulier (plusieurs prix pour la même date et la même matière), quelle est la valeur à prendre en compte ?
    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
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2013
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    La valeur a prendre en compte est une seule valeur dans ce cas la , top(1) ou rownum=1

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 805
    Points
    30 805
    Par défaut
    Que ce soit top ou rownum, il faut les associer avec un critère de tri... Lequel ?
    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.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2013
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    le critère de sélection est max(date_eff) , je veut prendre la valeur date max , et si la date max est en double alors je prend une seule ligne

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2013
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    es-qu'il y a pas de solution ?

    je veut surtout pas supprimer les doublons de la BDD.


    PLEASE HELP

  7. #7
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2017
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Avril 2017
    Messages : 502
    Points : 770
    Points
    770
    Par défaut
    Citation Envoyé par killerinstinct Voir le message
    NB : la requête est beaucoup plus compliqué que ça mais j'ai présenter seulement les colonnes qui pose problèmes .
    Salut, es-tu sur que le problème provient juste de là ?

    Cordialement.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2013
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    oui , les autres colonnes n'on pas d'effet sur le résultat

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2013
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Bonjour


    que des questions , aucune solution

  10. #10
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Bonsoir,

    Tout d'abord select distinct max(date_eff) from ... ne sert strictement à rien.
    La valeur fonction Max ne ramenant qu'une seule valeur, le distinct est en trop.

    Du coup si "on remonte" le distinct dans la première requête, il n'y aura plus de doublons.
    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
    Select distinct
       his.nom_mat,
       his.nom_tail,
       pri.prix_ind 
    From
       COMP_HIS his 
       left join
       comp_prix_std pri 
          on his.nom_mat = pri.nom_mat 
            and nvl(his.nom_tail, '0') = nvl(pri.nom_tail, '0') 
    Where
        pri.date_eff = (select  max(date_eff) 
                            from comp_prix_std 
                            where nom_mat = his.nom_mat 
                                and nvl(nom_tail, '0') = nvl(his.nom_tail, '0')
                        )
    Dis nous si ça le fait
    Le savoir est une nourriture qui exige des efforts.

  11. #11
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Citation Envoyé par Michel.Priori Voir le message
    Bonsoir,

    Tout d'abord select distinct max(date_eff) from ... ne sert strictement à rien.
    La valeur fonction Max ne ramenant qu'une seule valeur, le distinct est en trop.

    Du coup si "on remonte" le distinct dans la première requête, il n'y aura plus de doublons.
    [..]
    Euh non, si à la même date il y a plusieurs prix différents, alors on aura autant de lignes en retour que de prix différents pour une date donnée.
    Etant donné qu'il n'y a pas vraiment de critère(s) fonctionnel(s) défini(s), une solution un peu moins aléatoire que le RONWUM reste de définir un critère sur le prix (MIN, MAX, AVG ...)


    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
     
    Select 
       his.nom_mat,
       his.nom_tail,
       MIN(pri.prix_ind)
    From
       COMP_HIS his 
       left join
       comp_prix_std pri 
          on his.nom_mat = pri.nom_mat 
            and nvl(his.nom_tail, '0') = nvl(pri.nom_tail, '0') 
    Where
        pri.date_eff = (select  max(date_eff) 
                            from comp_prix_std 
                            where nom_mat = his.nom_mat 
                                and nvl(nom_tail, '0') = nvl(his.nom_tail, '0')
                        )
    group by his.nom_mat, his.nom_tail;

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2013
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Bonjour

    Tout d’abord merci pour votre aide

    la table comp_his est une table qui enregistre tout les mouvements stock ce qui veut dire qu'un mouvement d'une matière peut exister plusieurs fois dans la table, donc le Select distinct au début ne marche pas.

    Pour le max(prix_ind) on va dire la même chose ,car dans ce cas on va prendre la valeur max de chaque ligne qui se répète et c'est presque la même chose qu'un SELECT distinct.

    le problème c'est la date_eff qui est en double ,même si je prend la valeur max(date_eff) j'aurais une ligne en double .

    je vais essayer de supprimer les doublons manuel même si ce n'est pas la meilleur solution .

  13. #13
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 397
    Points
    397
    Par défaut
    Bonjour,

    C'est potentiellement très barbare mais une requête du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    WITH R1 As(
             select  max(date_eff) as DateMax,pri.nom_mat from comp_prix_std 
                   group by pri.nom_mat
    )
    Select 
       his.nom_mat,
       his.nom_tail,
       MIN(pri.prix_ind),
       RANK() OVER (PARTITION BY his.nom_mat , NIVEAU ORDER BY his.nom_mat) as RANG,
    From
       COMP_HIS his 
          JOIN R1 ON R1.nom_mat  = his.nom_mat AND nvl(his.nom_tail, '0') = nvl(pri.nom_tail, '0') 
    WHERE pri.date_eff = R1.DateMax
    Et filtrer ca en mettant le select dans une sous-requête pour avoir la ligne max de rang (Comme rang est propre à chaque nom article)

    Je n'ai pas testé la syntaxe mais c'est surtout pour donner une idée

    Bon courage

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2013
    Messages : 19
    Points : 8
    Points
    8
    Par défaut
    Bonjour

    j'ai fini par supprimer tout les doublons ayant la même dat_eff car j'ai constaté que tous les doublons (9 doublons sur 94263 lignes ) on la même date_eff.

    la date en question est le 01/01/2008

    je sais que c'était pas la bonne solution , mais parfois vaux mieux d’être un peut vulgaire contre certain problème

    code Final

    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
     Select  his.NOM_MAT,ma.lib_mat,his.dat_mvt_reel,his.TYP_MVT,his.sens_mvt,his.QTE_MVT,
    case 
     
    when pri.code_mon_tenu ='MAD' then pri.prix_ind/10000
     
    when pri.code_mon_tenu ='EUR' then  pri.prix_ind/10000 * '" + euro.Text + "'
     
    when pri.code_mon_tenu ='DOL' then  pri.prix_ind/10000 * '" + dolard.Text + "'
     
    end as prix_en_Mad ,
     
    case 
     
    when pri.code_mon_tenu ='MAD' then pri.prix_ind/10000 * his.qte_mvt
     
    when pri.code_mon_tenu ='EUR' then  pri.prix_ind/10000 * '" + euro.Text + "' * his.qte_mvt
     
    when pri.code_mon_tenu ='DOL' then  pri.prix_ind/10000 * '" + dolard.Text + "' * his.qte_mvt
     
    end as Total ,
    pri.code_mon_tenu From COMP_HIS his left join comp_prix_std pri on his.nom_mat=pri.nom_mat and his.code_colb=pri.code_colb and nvl(his.nom_tail,'0')=nvl(pri.nom_tail,'0') left join matiere ma on his.nom_mat=ma.nom_mat 
     Where his.CODE_MAGM='" + cro.Text + "' and his.DAT_MVT_REEL between '" + DateTimePicker1.Value.Date + "'and '" + DateTimePicker2.Value.Date + "'  
    and his.typ_mvt='" + mouvement.Text + "' and his.sens_mvt= '" + entresor.Text + "'   and  (( (select distinct max(date_eff) from comp_prix_std  where nom_mat=his.nom_mat and code_colb=his.code_colb and nvl(nom_tail,'0')=nvl(his.nom_tail,'0')) )= pri.date_eff
    Merci Beaucoup

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

Discussions similaires

  1. Erreur SQL dans une requête personnalisée
    Par Architekth dans le forum QxOrm
    Réponses: 6
    Dernier message: 03/04/2012, 13h06
  2. requête personnalisée et problème de like sur un integer
    Par jbrasselet dans le forum Entity Framework
    Réponses: 16
    Dernier message: 30/09/2011, 16h41
  3. [Débutant] GridView et requête personnalisée
    Par Pynouz dans le forum ASP.NET
    Réponses: 1
    Dernier message: 11/08/2011, 13h54
  4. [1.x] Admin generator - liste affichant requête personnalisée
    Par dawamiko dans le forum Symfony
    Réponses: 11
    Dernier message: 02/12/2009, 15h58
  5. [Requête]Personnalisation d'access lors de la création d'une requête
    Par Jealous_Elf dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 29/03/2007, 11h07

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