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 :

Problèmes de calcul dans une requete imbriquée


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 28
    Points
    28
    Par défaut Problèmes de calcul dans une requete imbriquée
    Bonjour, j'ai un problème avec une requête SQL que j'ai du mal à résoudre.
    Ma requête est censé rendre le nombre d'exemplaires disponibles d'un livre.

    Pour cela je fais appel à un calcul du nombre d'exemplaires existants, et à un calcul du nombre d'exmplaires disponibles (qui est en fait une soustraction entre le nombre d'exemplaires existants d'un livre, et le nombre d'exemplaire emprunté d'un livre).

    Un livre est emprunté quand il est présent dans la table ExemplaireEmprunte et quand il est affecté de la valeur 1 pour EtatEmprunte dans la table Exemplaire.

    Le résultat fourni est négatif et n'est donc pas correct.
    Si vous pouviez m'aider à reformuler ma requête pour qu'elle fonctionne. Ca me serait très utile.

    Merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT count(Livre.ISBN)as NbExistants, count(Livre.ISBN) - (SELECT count(Livre.ISBN) 
    FROM Livre, Exemplaire, ExemplaireEmprunte WHERE (Livre.ISBN = Exemplaire.ISBN) AND (NumeroInventaire= NumeroInvent)) as NbDispo, Livre.ISBN, Livre.Titre
    FROM Livre, Exemplaire WHERE (Livre.ISBN = Exemplaire.ISBN) 
    Group by Livre.ISBN, Livre.Titre;
    Structures de mes tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Create table Exemplaire
    (
    	NumeroInventaire int PRIMARY KEY, 
    	ISBN varchar(15),
    	EtatEmprunte int default(0),
    	constraint FKExemplaire foreign key (ISBN) references Livre(ISBN) deferrable initially deferred,
    	constraint CBoolean CHECK  (EtatEmprunte between 0 AND 1)
    );
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Create table Emprunt
    (
    	NAdherent int,
    	DateEmprunt Date,
    	DateRetour Date,
    	constraint PK_Emprunt primary key (NAdherent, DateEmprunt)
    );
    alter table Emprunt add constraint FK_Emprunt foreign key (NAdherent) references Adherent(AdherentNumero);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Create table ExemplaireEmprunte
    (
    	NumeroInvent int,
    	AdherentNumero int,
    	DateEmprunt date
    );
     
    ALTER table ExemplaireEmprunte ADD constraint FKExemplaireEmprunte1 foreign key (NumeroInvent) references Exemplaire(NumeroInventaire);
     
    ALTER table ExemplaireEmprunte ADD constraint FKExemplaireEmprunte2 foreign key (AdherentNumero, DateEmprunt) references Emprunt(NAdherent, DateEmprunt);

  2. #2
    Membre régulier Avatar de royto
    Homme Profil pro
    Développeur .Net & Web
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .Net & Web

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Points : 96
    Points
    96
    Par défaut
    Utilise des alias pour les colonnes que tu veux recupérer car on sait sait jamais qu'elle table est utilisé car elles sont définit plusieurs fois (ex : Livre)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(l1.ISBN)AS NbExistants, count(l1.ISBN) - (SELECT count(l2.ISBN) 
    FROM Livre l2, Exemplaire e2 , ExemplaireEmprunte ee WHERE (l2.ISBN = e2.ISBN) AND (e2.NumeroInventaire= ee.NumeroInvent)) AS NbDispo, l1.ISBN, l1.Titre
    FROM Livre l1 , Exemplaire e1 WHERE (l1.ISBN = e1.ISBN) 
    GROUP BY l1.ISBN, l1.Titre;
    Je ne sais pas si ton pb vient de la mais ca sera deja plus clair

  3. #3
    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 802
    Points
    30 802
    Par défaut
    Il y a de fortes chances pour que ta table EXEMPLAIREEMPRUNTE recense un historique des emprunts de l'exmplaire et pas seulement le dernier emprunt... D'où un cacul du nombre d'emprunts du livre et non du nombre d'exmplaires actuellement empruntés.
    Utilise tout simplement l'état Empunté de l'exemplaire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select    LIVRE.ISBN
        ,    LIVRE.TITRE
        ,    count(*)    as NBEXISTANTS
        ,    count(*) - sum(EXEMPLAIRE.ETATEMPRUNTE)    as    NBDISPO
    from     LIVRE
        inner join
            EXEMPLAIRE 
            on     LIVRE.ISBN = EXEMPLAIRE.ISBN 
    group by LIVRE.ISBN
        ,    LIVRE.TITRE
    ;
    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.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 28
    Points
    28
    Par défaut
    Comment count(*) - sum(EXEMPLAIRE.ETATEMPRUNTE) AS NBDISPO fait elle pour distinguer EtatEmprunte=0 (exemplaire disponible) et EtatEmprunte=1 (exemplaire emprunté) ?

    La requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(l1.ISBN)AS NbExistants, count(l1.ISBN) - (SELECT count(l2.ISBN) 
    FROM Livre l2, Exemplaire e2 , ExemplaireEmprunte ee WHERE (l2.ISBN = e2.ISBN) AND (e2.NumeroInventaire= ee.NumeroInvent)) AS NbDispo, l1.ISBN, l1.Titre
    FROM Livre l1 , Exemplaire e1 WHERE (l1.ISBN = e1.ISBN) 
    GROUP BY l1.ISBN, l1.Titre;
    me rend les résultats suivants :
    NBEXISTANTS NBDISPO ISBN TITRE
    ----------- ---------- --------------- ----------------------
    1 -4 1-2345-67111 Livre 1
    2 -3 1-2345-67112 Livre 2
    1 -4 1-2345-67113 Livre 3
    1 -4 1-2345-67114 Livre 4

  5. #5
    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 802
    Points
    30 802
    Par défaut
    Citation Envoyé par LeNovice
    Comment count(*) - sum(EXEMPLAIRE.ETATEMPRUNTE) AS NBDISPO fait elle pour distinguer EtatEmprunte=0 (exemplaire disponible) et EtatEmprunte=1 (exemplaire emprunté) ?
    count(*) compte le nombre d'exemplaires
    sum(EXEMPLAIRE.ETATEMPRUNTE) fait la somme des valeurs de ETATEMPRUNTE. Comme ETATEMPRUNTE vaut 1 si l'exemplaire est emprunté et 0 s'il est disponible, c'est équivalent au nombre d'exemplaires empruntés.
    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.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 32
    Points : 28
    Points
    28
    Par défaut
    Merci et en plus ça fonctionne.

  7. #7
    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 802
    Points
    30 802
    Par défaut
    Tu aurais été voir le contenu de la table EXEMPLAIREEMPRUNTE, tu aurais rapidement compris l'origine de ton erreur...
    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. calcul pourcentage dans une requete imbriquée
    Par timal78 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/07/2007, 14h28
  2. [débutant] problème de condition dans une requete
    Par banker dans le forum Access
    Réponses: 5
    Dernier message: 22/03/2006, 13h52
  3. [VBA-E]problème de date dans une requete
    Par isa21493 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 24/02/2006, 11h45
  4. Réponses: 2
    Dernier message: 22/02/2006, 11h18
  5. Calculs dans une requete avec conditions multiples
    Par Sha1966 dans le forum Access
    Réponses: 3
    Dernier message: 13/01/2006, 15h18

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