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

Langage SQL Discussion :

Aide sur requête SQL et comparaison


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 109
    Points : 49
    Points
    49
    Par défaut Aide sur requête SQL et comparaison
    bonjour
    je galère depuis un moment sur une requête, j'espère que vous pourrez m'aider
    en fait, j'ai deux tables, les factures de vente et les factures d'achat

    je souhaiterai que pour chaque ligne article des factures de vente (ref123, ...), avoir le montant du dernier achat en date avant la date de la facture de vente
    exemple :

    table_vente
    FACTVENT1 - 01/02/2018 - ref123
    FACTVENT1 - 01/02/2018 - ref456
    FACTVENT2 - 12/02/2018 - ref123

    table_achat
    FACTACH1 - 01/01/2018 - ref123 - 5€
    FACTACH2 - 11/02/2018 - ref123 - 10€
    FACTACH2 - 11/01/2018 - ref789 - 7€
    FACTACH3 - 26/01/2018 - ref456 - 9€
    FACTACH4 - 15/02/2018 - ref456 - 14€
    FACTACH5 - 28/02/2018 - ref123 - 20€

    résultat :
    FACTVENT1 - 01/02/2018 - ref123 - 5€
    FACTVENT1 - 01/02/2018 - ref456 - 9€
    FACTVENT2 - 12/02/2018 - ref123 - 10€


    merci

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Essayez comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
       select VT.NumFac
            , VT.DatVte
            , VT.Numero
            , AC.MtEuro
       from table_vente       as VT
       inner join table_achat as AC
          on AC.Numero = VT.Numero
         and AC.DatAch = 
            (select max(DatAch) 
             from table_achat subq
             where subq.Numero= AC.Numero
               and subq.DatAch=<VT.DatVte)
       order by VT.Numfac

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    merci beaucoup pour votre réponse
    cela semble fonctionné en partie, en effet, le numéro de facture/date/article de vente est répété autant de fois qu'il y a de facture d'achat avant la date de facture
    j'ai l'impression que le max() n'est pas pris en compte

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Si vous avez plusieurs fois la même ligne résultat, ajoutez le prédicat DISTINCT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       select distinct
              VT.NumFac
            , VT.DatVte
            , VT.Numero
            , AC.MtEuro
       from table_vente       as VT
       inner join table_achat as AC
       . . .

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Je viens de tester ma 1ère requête avec votre jeu d'essai et j'ai bien le résultat attendu, par contre il y a probablement une petite erreur dans votre énoncé la date de la facture d'achat n° change.

    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
    with VTE (Numfac, DatVte, Numero) as                                    
        (select 'FAC1', '2018-02-01', 'ref123'   
         UNION ALL                                                          
         select 'FAC1', '2018-02-01', 'ref456'   
         UNION ALL                                                          
         select 'FAC2', '2018-02-12', 'ref123'   
        )                                                                   
       , ACH (NumAch, DatAch, Numero, MtEuro) AS                            
        (select 'ACH1', '2018-01-01', 'ref123', 005.00   
         union all                                                          
         select 'ACH2', '2018-02-11', 'ref123', 010.00   
         union all                                                          
         select 'ACH2', '2018-02-11', 'ref789', 007.00   
         union all                                                          
         select 'ACH3', '2018-01-26', 'ref456', 009.00   
         union all                                                          
         select 'ACH4', '2018-02-15', 'ref456', 014.00   
         union all                                                          
         select 'ACH5', '2018-02-28', 'ref123', 020.00   
        )                                                
       select VT.NumFac                          
            , VT.DatVte                          
            , VT.Numero                          
            , AC.MtEuro                          
       from VTE        as VT                     
       inner join ACH  as AC                     
          on AC.Numero = VT.Numero               
         and AC.DatAch =                         
            (select max(DatAch)                  
             from ACH as SUBQ                    
             where SUBQ.Numero= AC.Numero        
               and SUBQ.DatAch<=VT.DatVte)       
       order by VT.Numfac
    Donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FAC1   2018-02-01 ref456    9.00  
    FAC1   2018-02-01 ref123    5.00  
    FAC2   2018-02-12 ref123   10.00

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    merci beaucoup pour votre aide
    je pense que la ligne se répète, c'est à cause que l'article se retrouve plusieurs fois dans la commande d'achat.je continue d'investiguer mais je pense que le résultat convient
    encore merci

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    bonsoir
    pour des raisons pratiques, je vais surement devoir faire la requête directement dans le select.
    car le problème qui se pose est qu'un article n'a pas forcément de facture d'achat.
    et comme la jointure est un inner, des résultats en vente ne seraient pas affichés

    et on ne peu faire ce genre de requête en LEFT OUTER à priori, c'est bien ça ?

    j'ai commencé à travailler là dessus, mais le résultat sortit n'est pas satisfaisant
    dans l'idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
       select VT.NumFac
            , VT.DatVte
            , VT.Numero
            ,  
     (select
      max(AC.MtEuro)
      from table_achat
      where VT.Numero = AC.Numero
      and AC.DatAch<=VT.DatVte)
     
       from table_vente       as VT
       ....
    Un grand merci pour l'aide que vous m’apporterais

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Atori Voir le message
    et on ne peu faire ce genre de requête en LEFT OUTER à priori, c'est bien ça ?
    Si bien sur :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select VT.NumFac
            , VT.DatVte
            , VT.Numero
            , AC.MtEuro
       from table_vente       as VT
       left join table_achat as AC
          on AC.Numero = VT.Numero
         and AC.DatAch = 
            (select max(DatAch) etc...

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 109
    Points : 49
    Points
    49
    Par défaut
    en fait, ça me dit que je ne peux pas faire de sous interrogation dans une jointure externe
    peut être car je group by

  10. #10
    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 789
    Points
    30 789
    Par défaut
    Quel est le message d'erreur exact ?
    Quel SGBD 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. Besoin d'aide sur requête Sql
    Par Sekigawa dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 31/12/2009, 15h14
  2. Aide sur requête SQL
    Par Pschittt dans le forum Langage SQL
    Réponses: 8
    Dernier message: 06/11/2008, 14h56
  3. Aide sur requête SQL
    Par Mister Paul dans le forum Langage SQL
    Réponses: 14
    Dernier message: 27/10/2008, 11h22
  4. aide sur requête sql
    Par Vodkha dans le forum Langage SQL
    Réponses: 9
    Dernier message: 30/08/2005, 17h53
  5. Aide sur Requête SQL
    Par devdev dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/05/2005, 12h33

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