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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2018
    Messages : 15
    Points : 13
    Points
    13

    Par défaut Comment réaliser cette requête?

    Bonjour,

    Je voudrais savoir, si possible, à quoi le "where" devrait ressembler si je veux connaitre les locaux dans lesquels se trouvent, au moins, 4 ordinateurs.

    Nom : mcd.jpg
Affichages : 87
Taille : 30,2 Ko

    Voici le "select" que j'ai réalisé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT tblLocal.numeroLocal, tblSite.lieu, tblMarque FROM tblSite 
    inner join tblLocal
    ON tblLocal.idSite = tblSite.idSite
    inner join tblOrdinateur
    ON tblOrdinateur.idLocal = tblLocal.idLocal
    inner join tblMarque
    ON tblOrdinateur.idMarque = tblMarque.idMarque
    Je n'ai appris que le "inner join" pour l'instant donc je joins tblOrdinateur à l'ensemble pour pouvoir accéder à tblMarque. Si vous avez une méthode qui
    permettrait de ne pas joindre tblOrdinateur (vu qu'il n'est pas utilisé), je serais curieux de savoir laquelle

    Merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 005
    Points : 25 947
    Points
    25 947

    Par défaut

    Pour compter le nombre d'ordinateurs dans un local, il faudra faire un regroupement.
    Les restrictions sur le réultat d'un regroupement ne s'efectuent pas dans la clause WHERE mais dans la clause HAVING, après les critères de regoupement énoncés dans la clause GROUP BY.
    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.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2018
    Messages : 15
    Points : 13
    Points
    13

    Par défaut

    Merci,

    J'ai trouvé la requête selon vos informations et elle fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT tblLocal.numeroLocal, tblSite.lieu, count(tblOrdinateur.idOrdinateur) FROM tblSite 
    inner join tblLocal
    ON tblLocal.idSite = tblSite.idSite
    inner join tblOrdinateur
    ON tblOrdinateur.idLocal = tblLocal.idLocal
    GROUP BY tblLocal.numeroLocal, tblSite.lieu
    HAVING COUNT(tblOrdinateur.idOrdinateur) > 3
    Cependant, j'avoue ne pas bien comprendre le concept du group by. Car sans group by, il me retourne une erreur. Je comprend bien que le group by regroupe la colonne pour éviter les doublons mais pourquoi c'est obligatoire? C'est certainement une question débile mais je suis vraiment débutant

    Merci

  4. #4
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    16 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    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 106
    Points : 32 061
    Points
    32 061
    Billets dans le blog
    6

    Par défaut

    Sans le GROUP BY, vous aurez tous les ordinateurs, à raison d'un ordinateur par ligne, avec répétition sur chaque ligne du site et du local s'il y a plusieurs ordinateurs dans un local.

    Comme vous voulez compter le nombre d'ordinateur par local, il faut faire un regroupement par local, donc utiliser un GROUP BY.

    Et comme vous cherchez les locaux qui ont plus de 3 ordinateurs, il faut mettre cette condition de restriction dans un HAVING qui est l'équivalent d'un WHERE mais qui opère sur un groupement.

    Le GROUP BY ne sert pas à éviter les doublons, même si c'est en pratique ce qu'il fait. Pour éviter des lignes en double dans le résultat d'une requête sans fonction de regroupement, on utilise DISTINCT.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre confirmé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    juillet 2011
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2011
    Messages : 244
    Points : 610
    Points
    610

    Par défaut

    Citation Envoyé par YellowError Voir le message
    Je comprend bien que le group by regroupe la colonne pour éviter les doublons mais pourquoi c'est obligatoire? C'est certainement une question débile mais je suis vraiment débutant

    Merci
    Le group by ser à indiquer sur quelles colonnes les agrégats seront calcules. Il ne sert pas à éviter les doublons même si c'est un de ses effets de bord.

    Normalement dans une requête select avec un group by tu dois citer dans la clause group by TOUTES les colonnes qui ne sont pas des fonctions d'agrégation (Count/Sum/Avg....)

    Cordialement

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2018
    Messages : 15
    Points : 13
    Points
    13

    Par défaut

    Merci beaucoup. Je comprends mieux même si j'ai toujours un peu de mal. Si je devais réutiliser un GROUP BY, je pense que je tatillonnerais encore. Je vais finir par avoir le déclic à un moment donné. Enfin, je l'espère.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    septembre 2007
    Messages
    7 164
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 7 164
    Points : 22 774
    Points
    22 774

    Par défaut

    Hello,

    Citation Envoyé par YellowError Voir le message
    Merci beaucoup. Je comprends mieux même si j'ai toujours un peu de mal. Si je devais réutiliser un group by, je pense que je tatillonnerais encore. Je vais finir par avoir le déclic à un moment donner. Enfin je l'espère.
    Tu peux retenir que « GROUP BY » est nécessaire dès lors que l'on utilise des « fonctions d'agrégation » (sauf si tu veux travailler sur le dataset entier).

    Les fonctions d'agrégation, à l'inverse des fonctions ordinaires, travaillent sur un ensemble de valeurs. Par exemple : SUM(), MIN(), MAX() et COUNT(), qui te rendent respectivement le total, la valeur minimum, la valeur maximum et le nombre d'éléments observés dans une une colonne donnée, soit dans ce dernier cas le nombre de lignes, sauf si la colonne contient des NULL).

    Cela veut dire qu'il faut passer en revue le dataset entier pour pouvoir donner ces informations. Dans ce cas, le résultat de ta requête pourra avoir autant de colonnes que tu le souhaites (une par expression évaluée) mais n'aura forcément qu'une seule ligne. Ça veut dire également que ce mode de fonctionnement est — en principe — incompatible avec le mode de fonctionnement habituel : tu ne peux pas sélectionner simultanément une colonne et une fonction d'agrégation, puisque le résultat de cette dernière n'aura de sens qu'une fois le dataset entièrement passé en revue. Elle ne peut donc pas être interrogée en cours de traitement ni associée à un tuple en particulier, parce que cela n'aurait pas de sens.

    « GROUP BY », en revanche, te permet de regrouper les lignes d'un dataset en fonction de la valeur d'une ou plusieurs colonnes. En gros : toutes les lignes dont les valeurs des colonnes nommées sont identiques vont être rassemblées dans un même groupe et tes fonctions d'agrégation s'appliqueront alors sur chacun de ces groupes et plus sur la table entière. Ceci te permet de « partitionner » ta table selon un critère donné. Tu obtiendras à la fin autant de ligne qu'il y a de groupes, c'est-à-dire de combinaisons différentes pour les valeurs des colonnes nommées dans ta clause GROUP BY.

    Par ailleurs, comme toutes les colonnes citées dans GROUP BY ont toujours la même valeur au sein d'un même groupe, il est possible de les remettre dans le SELECT en vis-à-vis du résultat des fonctions d'agrégation.

    Imagine par exemple que tu aies une table qui contienne la température relevée à midi pour chacun des jours de l'année (dans le désordre…)

    +----+----+-----------+
    |mois|jour|temperature|
    +----+----+-----------+
    |  1 |  5 |  3        |
    +----+----+-----------+
    |  3 |  2 |  9        |
    +----+----+-----------+
    |  5 |  3 | 17        |
    +----+----+-----------+
    |  4 | 12 | 11        |
    +----+----+-----------+
    |  4 | 19 | 16        |
    +----+----+-----------+
    |  5 |  4 | 21        |
    +----+----+-----------+
    |  5 |  5 | 28        |
    +----+----+-----------+
    |  1 | 12 | -2        |
    +----+----+-----------+
    |  1 | 13 |  4        |
    +----+----+-----------+
    |  1 | 14 |  5        |
    +----+----+-----------+
    Admettons que tu veuilles connaître les températures minimum et maximum observés. Sans regroupement, ces résultats concerneraient l'année entière :

    SELECT min(temperature), max(temperature) FROM table
    
    +-----+-----+
    | min | max |
    +-----+-----+
    |  -2 |  28 |
    +-----+-----+
    Mais si tu fais un regroupement par mois, tu obtiendras les extrémas de chaque mois en particulier :

    SELECT mois,min(temperature), max(temperature) FROM table GROUP BY mois ORDER BY mois ASC
    
    +-----+-----+-----+
    | mois| min | max |
    +-----+-----+-----+
    |   1 |  -2 |   5 |
    +-----+-----+-----+
    |   3 |   9 |   9 |
    +-----+-----+-----+
    |   4 |  11 |  16 |
    +-----+-----+-----+
    |   5 |  17 |  28 |
    +-----+-----+-----+
    Ce qui correspond tout-à-fait à ce que l'on trouverait si on triait la table par mois puis par température, que l'on traçait une séparation entre deux mois, et que l'on prenait la première et dernière ligne de chaque groupe :

    SELECT mois, jour, temperature FROM table order by mois ASC, temperature ASC, jour ASC
    
    +------+------+-------------+
    | mois | jour | temperature |
    +------+------+-------------+
    |    1 |   12 |          -2 |
    |    1 |    5 |           3 |
    |    1 |   13 |           4 |
    |    1 |   14 |           5 |
    |      |      |             |
    |    3 |    2 |           9 |
    |      |      |             |
    |    4 |   12 |          11 |
    |    4 |   19 |          16 |
    |      |      |             |
    |    5 |    3 |          17 |
    |    5 |    4 |          21 |
    |    5 |    5 |          28 |
    +------+------+-------------+

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    novembre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2018
    Messages : 15
    Points : 13
    Points
    13

    Par défaut

    Super merci. C'est limpide.

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

Discussions similaires

  1. Comment réaliser cette requête
    Par nostrora dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/05/2012, 21h55
  2. Comment faire cette requête ?
    Par Cazaux-Moutou-Philippe dans le forum Bases de données
    Réponses: 11
    Dernier message: 02/11/2007, 08h44
  3. [XHTML] Comment réaliser cette boite ?
    Par °°° Zen-Spirit °°° dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 08/09/2006, 20h19
  4. Comment réaliser ma requête ?
    Par leloup84 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 21/02/2006, 09h16
  5. Comment réaliser cette config multiboot Windows-Linux?
    Par _Alain_ dans le forum Autres Logiciels
    Réponses: 11
    Dernier message: 11/01/2006, 15h40

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