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 :

requete SQL (imbriqué?)


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2009
    Messages : 164
    Points : 91
    Points
    91
    Par défaut requete SQL (imbriqué?)
    Bonjour,

    voila j'ai une table "Taches" qui possede comme clé primaire "IDtache" et un attribut "chargeReelle"

    J'ai une autre table "Cras" qui possede comme clé primaire "IDcra", un attribut "duree" et un attribut "IDtache" (en relation donc avec la table Taches)

    Je voudrai récupérer les IDtache dont la somme de ses cras et différent de la chargeReelle.

    Quelqu'un pourrait m'aider à formuler la requete s'il vous plait?

    Merci

    léa

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Avec la structure des tables, ce serait plus facile.

    As-tu essayé une requête ?

    Décompose le problème en cherchant d'abord la somme des durées de chaque tâches dans la table CRAS puis fait une jointure de la requête avec la table des tâches et compare la somme des durées et la charge totale.

  3. #3
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2009
    Messages : 164
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Avec la structure des tables, ce serait plus facile.
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
     
    CREATE TABLE `taches` (
      `IDtache` int(10) unsigned NOT NULL auto_increment,
      `IDprojet` int(10) unsigned NOT NULL default '0',
      `IDtacheMere` int(10) unsigned default NULL,
      `Type` char(1) NOT NULL default '',
      `SousType` varchar(4) default NULL,
      `NiveauCriticite` int(10) unsigned NOT NULL default '0',
      `NiveauPriorite` int(10) unsigned NOT NULL default '0',
      `StatutActuel` int(3) unsigned NOT NULL default '0',
      `CouleurStatutActuel` char(1) NOT NULL default '',
      `LibStatutActuel` varchar(20) NOT NULL default '',
      `ReferenceClient` varchar(20) default NULL,
      `Initiateur` varchar(20) default NULL,
      `DescriptionCourte` varchar(150) NOT NULL default '',
      `DescriptionLongue` text,
      `Commentaires` text,
      `Intervenant` int(10) unsigned default NULL,
      `ContexteFacturation` varchar(10) default NULL,
      `ReferenceFacturation` varchar(20) default NULL,
      `DateDebutPrevue` datetime default NULL,
      `DateFinPrevue` datetime default NULL,
      `DateDebutReelle` datetime default NULL,
      `DateFinReelle` datetime default NULL,
      `ChargePrevue` int(10) unsigned default NULL,
      `ChargeReelle` int(10) unsigned default NULL,
      `ResteAFaire` int(10) unsigned default NULL,
      `Environnement` int(10) unsigned NOT NULL default '0',
      `Origine` int(10) unsigned default NULL,
      `Typologie` int(10) unsigned default NULL,
      `CodeCatclient` varchar(5) default NULL,
      `ExclureCalculIndicateurs` char(1) NOT NULL default 'N',
      `PourcentageRealise` int(3) unsigned default '0',
      `chaine` varchar(25) default NULL,
      `EnvoiDevisPrevue` date default NULL,
      `EnvoiDevisReelle` date default NULL,
      `DevisLivraisonDemande` date default NULL,
      `DevisLivraisonPropose` date default NULL,
      `EtatDevis` char(1) default NULL,
      `DateValidDevis` date default NULL,
      `ImpressionDevis` int(1) default NULL,
      `LivraisonRecettePrevue` date default NULL,
      `LivraisonRecetteReelle` date default NULL,
      `DebutRecettePrevue` date default NULL,
      `FinRecettePrevue` date default NULL,
      `DebutRecetteReelle` date default NULL,
      `FinRecetteReelle` date default NULL,
      `ProductionPrevue` date default NULL,
      `ProductionReelle` date default NULL,
      `CommentairesRecette` varchar(150) default NULL,
      `ImpressionRecette` int(1) default NULL,
      PRIMARY KEY  (`IDtache`)
    ) TYPE=MyISAM PACK_KEYS=0 AUTO_INCREMENT=20382 ;
     
     
    CREATE TABLE `cras` (
      `IDactivite` int(10) unsigned NOT NULL auto_increment,
      `IDressource` int(10) unsigned NOT NULL default '0',
      `Date` date NOT NULL default '0000-00-00',
      `IDabsence` int(10) unsigned default NULL,
      `IDtache` int(10) unsigned default NULL,
      `DescriptionCourteTache` varchar(150) default NULL,
      `Duree` int(10) unsigned NOT NULL default '0',
      `Nature` int(10) unsigned default NULL,
      `LibelleNature` varchar(35) default NULL,
      `Descriptif` varchar(50) default NULL,
      `Remarques` varchar(80) default NULL,
      `DemandeModifStatut` int(10) unsigned default NULL,
      PRIMARY KEY  (`IDactivite`),
      KEY `IDactivite` (`IDactivite`)
    ) TYPE=MyISAM PACK_KEYS=0 AUTO_INCREMENT=133198 ;
    Citation Envoyé par CinePhil Voir le message
    As-tu essayé une requête ?
    oui plusieurs .

    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
     
     
    SELECT idTache 
    FROM taches T
    WHERE chargeReelle <>
       ( SELECT SUM(duree)
         FROM cras C 
         WHERE T.idtache = C.idTache
        GROUP BY C.idTache)
     
    apres en changeant <> par NOT IN, en enlevant le group by
    etc..
     
    mais a chaque fois j'ai des erreurs de syntaxe
    Citation Envoyé par CinePhil Voir le message
    Décompose le problème en cherchant d'abord la somme des durées de chaque tâches dans la table CRAS puis fait une jointure de la requête avec la table des tâches et compare la somme des durées et la charge totale.
    j'ai pas compri désolé...

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Tu n'étais pas très loin avec ta sous-requête...

    Décompose le problème en cherchant d'abord la somme des durées de chaque tâches dans la table CRAS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT idTache, SUM(duree) AS somme_duree
    FROM cras
    GROUP BY idTache
    puis fait une jointure de la requête avec la table des tâches et compare la somme des durées et la charge totale.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t.idTache, t.ChargeReelle, tmp.somme_duree
    FROM taches AS t
    INNER JOIN (
      SELECT idTache, SUM(duree) AS somme_duree
      FROM cras
      GROUP BY idTache
    ) AS tmp ON t.IDtache = tmp.idTache
    WHERE t.ChargeReelle <> tmp.somme_duree

  5. #5
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2009
    Messages : 164
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par CinePhil Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT t.idTache, t.ChargeReelle, tmp.somme_duree
    FROM taches AS t
    INNER JOIN (
      SELECT idTache, SUM(duree) AS somme_duree
      FROM cras
      GROUP BY idTache
    ) AS tmp ON t.IDtache = tmp.idTache
    WHERE t.ChargeReelle <> tmp.somme_duree
    ah oui... ok j'aurai jamais pensé comme ça... mais c'est bon j'ai compri le truc.
    Mais ta requête m'indique également une erreur de syntaxe

    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
     
    SELECT t.idTache, t.ChargeReelle, tmp.somme_duree
    FROM taches AS t
    INNER JOIN (
     
     
    SELECT idTache, SUM( duree ) AS somme_duree
    FROM cras
    GROUP BY idTache
    ) AS tmp ON t.IDtache = tmp.idTache
    WHERE t.ChargeReelle <> tmp.somme_duree
    LIMIT 0 , 30 
     
    MySQL a répondu:
     
     
    #1064 - Erreur de syntaxe près de 'SELECT idTache, SUM( duree )  AS somme_duree
    FROM cras
    GROUP  BY' à la ligne 4
    cette partie là marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT idTache, SUM( duree ) AS somme_duree
    FROM cras
    GROUP BY idTache
    mais dés que je l'ajoute au reste la meme erreur revient...

  6. #6
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2009
    Messages : 164
    Points : 91
    Points
    91
    Par défaut
    J'ai vu une autre personne dans le forum de "MySQL" qui a eu le meme probleme que moi...
    Il suppose que c'est lié à la version c'est possible?
    j'ai : MySQL 4.0.18

  7. #7
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2009
    Messages : 164
    Points : 91
    Points
    91
    Par défaut
    C'est bon!!

    bon je n'ai pas fais de sous-requete finalement, j'ai utilisé un HAVING


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT Cl.nom as client,PO.nom as pole,A.nom as application, P.libelle as projet, T.idTache, T.chargeReelle,SUM(duree) as somme_cras
    FROM taches T, cras C,Clients Cl,poles PO, applications A,projets P
    WHERE T.idTache = C.idTache
    AND P.idProjet = T.idProjet
    AND A.idApplication = P.idApplication
    AND PO.idPole = A.idPole
    AND Cl.idClient = PO.idClient

    merci encore pour l'aide

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    J'ai vu une autre personne dans le forum de "MySQL" qui a eu le meme probleme que moi...
    Il suppose que c'est lié à la version c'est possible?
    j'ai : MySQL 4.0.18
    Effectivement, je crois que les sous-requêtes ne sont pas possible avec cette vieille version.
    Si tu peux, met à jour MySQL.

    bon je n'ai pas fais de sous-requete finalement, j'ai utilisé un HAVING

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT Cl.nom AS client,PO.nom AS pole,A.nom AS application, P.libelle AS projet, T.idTache, T.chargeReelle,SUM(duree) AS somme_cras
    FROM taches T, cras C,Clients Cl,poles PO, applications A,projets P
    WHERE T.idTache = C.idTache
    AND P.idProjet = T.idProjet
    AND A.idApplication = P.idApplication
    AND PO.idPole = A.idPole
    AND Cl.idClient = PO.idClient
    Euh... Il est où le HAVING ?
    Il n'y a même pas de GROUP BY dans ta requête !
    Erreur de copier/coller ?

    Et les jointures s'écrivent depuis 1992 de façon normalisée avec JOIN.

  9. #9
    Membre régulier
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    164
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2009
    Messages : 164
    Points : 91
    Points
    91
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Euh... Il est où le HAVING ?
    Il n'y a même pas de GROUP BY dans ta requête !
    Erreur de copier/coller ?
    pardon oui probleme de copier coller.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT Cl.nom as client,PO.nom as pole,A.nom as application, P.libelle as projet, T.idTache, T.chargeReelle,SUM(duree) as somme_cras
    FROM taches T, cras C,Clients Cl,poles PO, applications A,projets P
    WHERE T.idTache = C.idTache
    AND P.idProjet = T.idProjet
    AND A.idApplication = P.idApplication
    AND PO.idPole = A.idPole
    AND Cl.idClient = PO.idClient
    GROUP BY T.idTache,T.chargeReelle,Cl.nom,PO.nom,A.nom , P.libelle
    HAVING SUM(duree)<>IFNULL(T.chargeReelle,0)
    ORDER BY Cl.nom,PO.nom,A.nom,P.libelle
    pour les jointure avec JOIN c'est bon à savoir merci^^ mais pour l'instant j'ai du mal avec les JOIN (quand un table a une jointure avec plusieurs autres tables). faut que je travaille ca^^

    bonne journée

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par leame Voir le message
    pour l'instant j'ai du mal avec les JOIN (quand un table a une jointure avec plusieurs autres tables). faut que je travaille ca^^
    C'est pas bien compliqué ; il suffit de parcourir le schéma de la BDD et d'indenter correctement sa requête :
    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 Cl.nom AS client, 
      PO.nom AS pole,
      A.nom AS application, 
      P.libelle AS projet, 
      T.idTache, T.chargeReelle,
      SUM(duree) AS somme_cras
    FROM taches T
    INNER JOIN cras C ON T.idTache = C.idTache
    INNER JOIN projets P ON P.idProjet = T.idProjet
      INNER JOIN applications A ON A.idApplication = P.idApplication
        INNER JOIN poles PO ON PO.idPole = A.idPole
          INNER JOIN Clients Cl ON Cl.idClient = PO.idClient
    GROUP BY T.idTache, T.chargeReelle, Cl.nom, PO.nom, A.nom , P.libelle
    HAVING SUM(duree)<>IFNULL(T.chargeReelle,0)
    ORDER BY Cl.nom,PO.nom, A.nom, P.libelle

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

Discussions similaires

  1. [1.x] Requetes SQL imbriquées
    Par pmithrandir dans le forum Symfony
    Réponses: 1
    Dernier message: 30/12/2009, 21h31
  2. requete sql imbriquée
    Par Ludo75 dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/07/2008, 12h06
  3. Requetes SQL imbriquées
    Par olibara dans le forum Requêtes
    Réponses: 0
    Dernier message: 25/02/2008, 20h34
  4. requetes sql imbriquées
    Par lesaint972 dans le forum Accès aux données
    Réponses: 5
    Dernier message: 28/08/2007, 16h54
  5. Requete Sql imbriqué
    Par NeHuS dans le forum ASP
    Réponses: 11
    Dernier message: 01/06/2006, 12h17

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