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 :

requetes imbriquees et sommes


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 45
    Points
    45
    Par défaut requetes imbriquees et sommes
    bonjour a tous,

    J'avais un script (JSP) ou je faisais plusieurs requetes avec des boucles sur les resultats pour calculer des trucs... Et maintenant j'utilise un outil de report qui m'oblige a tout rassembler dans une seule requete... Sauf qu'avec le SQL je me fais vite des noeuds au cerveau quand ca devient un peu plus compliqué...

    Peut-etre pourrez-vous m'aider a y voir un peu plus clair ?

    tout d'abord mes tables :

    departement (id - nom_dep)
    cours_departement (id_cours - id_dep)
    cours (id_cours - id_semestre)
    activity (id_cours - ....)
    cours_user (id_cours - id_user - roles...)

    mon script :
    je recupere tous les departements.
    pour chaque departement je recupere la liste des cours attachés
    pour chaque cours
    je compte combien de records j'ai dans la table activity concernant ce cours
    je compte combien de records j'ai dans la table cours_user concernant ce cours et dont le role du user est 'G'

    j'additionne les valeurs 'activity' de tous les cours d'un departement
    j'additionne les valeurs 'cours_user' de tous les cours d'un departement
    a la fin, j'ai un tableau me donnant ces informations :

    nom du departement - nombre de cours dans ce departement - total de l'activite pour ce dep - total des utilisateurs avec le role 'G' pour ce dep

    voici la requete unique qui, je pensais, correspondait a ce script, mais je ne maitrise pas les fonctions de somme ou autre donc ca ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select d.nom_dep, count(d.id_dep), sum(c1.count(*)), sum(c2.count(*)) 
    from departement d, 
    		cours_departement cd, 
    		cours c, 
    		(select id_cours  , count(*) from activity  group by id_cours ) c1,  
    		(select id_cours , count(*) from cours_users   where ROLE='G' group by id_cours ) c2  
    where c.id_cours  = c1.id_cours 
    		and c.id_cours = c2.id_cours 
    		and cd.id_dep  = d.id_dep 
    		and cd.id_cours = c.id_cours  
    group by d.id_dep
    ca a l'air de bloquer au niveau des sommes... any idea ?

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Salut,

    Je crois pas que tu puisses faire un sum(count(*)), mais en utilisant un alias au moins ça ne "bloquera" plus (si j'ai bien compris ce que tu voulais):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT d.nom_dep, count(d.id_dep), sum(c1.nb1), sum(c2.nb2) 
    FROM departement d, 
    		cours_departement cd, 
    		cours c, 
    		(SELECT id_cours  , count(*) as nb1 FROM activity  GROUP BY id_cours ) c1,  
    		(SELECT id_cours , count(*) as nb2 FROM cours_users   WHERE ROLE='G' GROUP BY id_cours ) c2  
    WHERE c.id_cours  = c1.id_cours 
    		AND c.id_cours = c2.id_cours 
    		AND cd.id_dep  = d.id_dep 
    		AND cd.id_cours = c.id_cours  
    GROUP BY d.id_dep

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 45
    Points
    45
    Par défaut
    en effet, ca ne bloque plus... merci !

    il faut maintenant que je verifie si j'obtiens le meme resultat que mon script... ca j'en suis pas sure...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 45
    Points
    45
    Par défaut
    Eh bien je n'ai pas du tout le meme resultat...

    voici mon script :

    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
     
    my $dptquery = "SELECT pk1, batch_uid, title FROM gc ORDER BY title";
    my $dptqh = $dbh->prepare($dptquery);
    $dptqh->execute();
    print "Dept Code\tDept Title\tNumber of Sections\tActivated\tNumber of Accesses\n";
    while (my($dptpk, $batch_uid, $title) = $dptqh->fetchrow_array()) {
      my $course_cat_q = "SELECT gcc.crsmain_pk1, cm.course_id FROM gcc, cm WHERE gcc.gatewaycat_pk1=$dptpk AND gcc.crsmain_pk1=cm.pk1";
      my $ccqh = $dbh->prepare($course_cat_q);
      $ccqh->execute();
      my $dept_count = 0;
      my $acc_count = 0;
      my $active_count = 0;
      while (my ($crsmain_pk1, $course_id) = $ccqh->fetchrow_array()) {
        $dept_count++;
        my $access_query = "SELECT count(1) FROM aa WHERE course_pk1=$crsmain_pk1";
        my $acqh = $dbh->prepare($access_query);
        $acqh->execute();
        my ($accesses) = $acqh->fetchrow_array();
        $acc_count+=$accesses;
        $acqh->finish();
        my $active_query = "SELECT count(1) FROM cu WHERE crsmain_pk1=$crsmain_pk1 AND (role=\'P\' OR role=\'G\')";
        my $activeqh = $dbh->prepare($active_query);
        $activeqh->execute();
        my $instructors = 0;
        ($instructors) = $activeqh->fetchrow_array();
        if ($instructors > 0) {
          $active_count++;
        }
        $activeqh->finish();
      }
      $ccqh->finish();
      if ($acc_count > 0) {
        print "$batch_uid\t$title\t\t$dept_count\t$active_count\t$acc_count\n";
      }
    }
    comment obtenir le meme resultat avec une seule requete ?

    merci de votre aide.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Pourrais tu nous fournir un jeu de test avec le résultat souhaité stp, ce sera beaucoup plus facile pour nous

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    47
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 47
    Points : 45
    Points
    45
    Par défaut
    ok, je vais essayer.

    table gc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pk1   batch_uid   title
    1      009            nom1
    2      012            nom2
    3      025            nom3
    table gcc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    gatewaycat_pk1           crsmain_pk1
    1                                 235
    1                                 531
    2                                 123
    2                                 953
    2                                 056
    3                                 463
    table cm :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    pk1                        course_id
    1                           'english002'
    2                           'english004'
    3                           'maths012'
    4                           'history003'
    table aa : (table enorme avec beaucoup de lignes par cours)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    course_pk1     type_acces
    1                    blabla
    1                    blabla
    1                    blabla
    1                    blabla
    2                    blabla
    2                    blabla
    2                    blabla
    2                    blabla
    table cu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    crsmain_pk1        user_pk1        role
    1                         456123          'G'
    1                         489               'S'
    2                         ...                 'P'
    ...

    resultat que je veux obtenir :

    [code dept (gc.batch_uid)] [nom du dept(gc.title)] [nb de cours par dept] [nb de cours actifs] [nombre d'acces a ce cours]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dept Code	Dept Title			Number of Sections	Activated	Number of Accesses
    009		Accounting			53			24		3099
    023		Africana Studies		50			10		52
    088		Agriculture/Natural Resources	25			6		12
    099		American Studies		21			10		5
    113		Animal Science			60			17		4
    122		Anthropology			335			46		15
    133		Architecture			141			2		21
    le nombre de cours actifs pour un dept est calculé en additionnant le nombre de cours de ce departement qui a au moins une ligne dans la table 'cu' avec un role P ou G

    le nombre d'acces pour un dept est calculé en additionnant le resultat de la requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT count(1) FROM aa WHERE course_pk1=$crsmain_pk1
    pour chaque cours de ce dept.

    j'espere que c'est pas trop fouilli...

Discussions similaires

  1. [VBnet][Access] Requete imbriquee "insert + select"
    Par Fab62_ dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/03/2006, 13h58
  2. Réponses: 2
    Dernier message: 09/01/2006, 16h10
  3. requete imbriquee
    Par pascale86 dans le forum Requêtes
    Réponses: 6
    Dernier message: 23/09/2005, 15h10
  4. [REQUETE][IMBRIQUEE] Bien ou pas bien?
    Par fabszn dans le forum Langage SQL
    Réponses: 31
    Dernier message: 21/04/2005, 10h57
  5. PROBLEME DE REQUETE IMBRIQUEE
    Par fleuve007 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 31/12/2003, 15h33

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