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 :

Requête complexe non trouvée


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Par défaut Requête complexe non trouvée
    Bonjour à tous,

    je suis coincé dans une requête.
    j'ai une table facture (idfacture,datefacture,idavoir....)
    j'ai une table ligne facture(idligne,idfacture,codarticle,....)
    je peux faire plusieurs avoir partiel sur une même facture.
    lorsque il y a un avoir partiel je crée une nouvelle facture avec les codarticle sélectionnés.

    idfacture datefacture idavoir
    1 01/01/2007 0
    2 03/01/2007 1

    la deuxième facture c'est un avoir sur la facture 1

    ligne facture
    idligne idfacture codarticle
    1 1 0001
    2 1 0002
    3 1 0003
    1 2 0001

    Les premiers articles font parties de la facture 1
    La dernière ligne fait partie de la facture 2 ou il y a eu l’avoir
    si je fais un nouvel avoir sur la facture 1 je ne dois afficher que les lignes factures qui n'ont pas eue d'avoir donc les articles 0002 et 0003.
    comment faire cette requête.

    Merci

  2. #2
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Bonjour,
    ça devrait donner quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select codarticle from ligne_facture l1
    where 
         idfacture = 1
     and not exists (select 1 from ligne_facture l2 natural inner join facture f2 where l2.codarticle=l1.codarticle and l1.idfacture = f2.idavoir);
    ou un peu plus tordu (mais j'aime bien) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select codarticle from(
      select codarticle, sum(case when idfacture = 1 then 1 else (case when idavoir = 1 then 10 else 0 end) end) ok
      from ligne_facture natural inner join facture
      group by codarticle
      )
    where ok = 1;
    A+

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Par défaut
    bonjour,

    Merci de ta réponse, mais j'ai un message d'erreur pour la première
    Syntaxe incorrecte vers le mot clé 'WHERE'

    Merci

  4. #4
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Quel est ton SGBD ?
    Il ne supporte peut-être pas les jointures SQL2, essaie de mettre les jointures dans le where :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT codarticle FROM ligne_facture l1
    WHERE 
         idfacture = 1
     AND NOT EXISTS (SELECT 1 FROM ligne_facture l2, facture f2 WHERE l2.idfacture=f2.idfacture and l2.codarticle=l1.codarticle AND l1.idfacture = f2.idavoir);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT codarticle FROM(
      SELECT codarticle, sum(case when facture.idfacture = 1 then 1 else (case when idavoir = 1 then 10 else 0 end) end) ok
      FROM ligne_facture, facture
      where ligne_facture.idfacture = facture.idfacture
      GROUP BY codarticle
      )
    WHERE ok = 1;

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Par défaut
    Merci Chifro de ta réponse, j'utilise sqlserver 2000 et j'ai toujours le même message d'erreur.

    Merci

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    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 138
    Par défaut
    Si j'ai bien compris, idligne est l'identifiant qui permet de lier la ligne d'avoir à la ligne de facture.
    Sinon il n'apparaît pas dans les informations que tu nous donnes...

    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    f.*, l.*
    from    ligne_facture    as l
        inner join
            facture as f
            on f.idfacture = l.idfacture
    where    f.idavoir = 0
        and    not exists
            (    select    1
                from    ligne_facture    as la
                    inner join
                        facture as fa
                        on fa.idfacture = la.idfacture
                where    fa.idavoir = 1
                    and    l.idligne = la.idligne 
            )
    ;
    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.

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Par défaut
    Merci al1_24, la requête fonctionne correctement.
    mais peut tu me dire comment fais tu pour faire cette requête?
    je voudrais comprendre ta logique, moi je n'y arrive pas.

    Merci

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    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 138
    Par défaut
    Deux requêtes :
    La première liste les lignes des factures (qui ne sont pas des avoirs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select    f.*, l.*
    from    ligne_facture    as l
        inner join
            facture as f
            on f.idfacture = l.idfacture
    where    f.idavoir = 0
    La seconde liste les lignes des avoirs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            (    select    *
                from    ligne_facture    as la
                    inner join
                        facture as fa
                        on fa.idfacture = la.idfacture
                where    fa.idavoir = 1
            )
    Il ne reste plus qu'à conserver les lignes de la première qui ne sont pas dans la deuxième.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select    *
    from    requête1
    where    not exists
            (    select    *
                from    requête2
                where    requête1.idligne = requête2.idligne
            )
    ;
    J'aurais pu le faire avec un NOT IN :
    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
    select    *
    from    ligne_facture    as l
        inner join
            facture as f
            on f.idfacture = l.idfacture
    where    f.idavoir = 0
        and    l.idligne not in
            (    select    la.idligne
                from    ligne_facture    as la
                    inner join
                        facture as fa
                        on fa.idfacture = la.idfacture
                where    fa.idavoir = 1
            )
    ;
    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.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 11/03/2014, 23h15
  2. [Oracle] Requête avec une variable contenant une chaine de caractères accentué non trouvé
    Par chris0938 dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 07/01/2011, 22h23
  3. [AC-2003] Aide pour la création d'une requête complexe de non-correspondance ?
    Par [ZiP] dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 09/04/2010, 15h12
  4. [AC-2003] Elément non trouvé dans une requête
    Par chuspyto dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 17/10/2009, 20h15
  5. Valeur non trouvé dans une requète SQL
    Par Jeankiki dans le forum Bases de données
    Réponses: 2
    Dernier message: 15/12/2006, 17h36

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