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

VB.NET Discussion :

Requête de comptage de doublon


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    instituteur
    Inscrit en
    Juillet 2018
    Messages
    617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : instituteur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2018
    Messages : 617
    Par défaut Requête de comptage de doublon
    Bonjour à tous...
    J'ai besoin d'une aide sur une requête de doublon. J'ai utilisé l'IA mais le code généré me laisse perplexe.

    Voici l'exercice que je cherche à résoudre : soit une table Élèves comportant 3 colonnes: Nom, Matières et Notes. Dans la colonne Notes nous avons ces caractères qui représentent les notes{A, A, B, C, A, C, B, D, B, C, A, A, B, C, A, B}. Ecrire une requête en vb net qui déterminera le nombre exact d'élèves ayant des notes pour chacun des types A, B, C et D puis l'afficher dans une datagridview en créant une quatrième colonne Nombre.
    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
    ' Assurez-vous d'avoir une base de données avec une table Élèves contenant les colonnes Nom, Matières et Notes
    Dim dt As New DataTable()
    dt.Columns.Add("Nom", GetType(String))
    dt.Columns.Add("Matières", GetType(String))
    dt.Columns.Add("Notes", GetType(String))
     
    ' Ajouter des données pour la démonstration
    Dim noms() As String = {"Alice", "Bob", "Charlie", "David", "Eve", "Frank", "Grace", "Hannah", "Ivy", "Jack", "Kathy", "Leo", "Mona", "Nina", "Oscar", "Paul"}
    Dim notes() As String = {"A", "A", "B", "C", "A", "C", "B", "D", "B", "C", "A", "A", "B", "C", "A", "B"}
     
    For i As Integer = 0 To noms.Length - 1
        dt.Rows.Add(noms(i), "Matière" & (i + 1), notes(i))
    Next
     
    ' Compter les occurrences de chaque note
    Dim query = From row In dt.AsEnumerable()
                Group row By note = row.Field(Of String)("Notes") Into Group
                Select New With {
                    .Note = note,
                    .Nombre = Group.Count()
                }
     
    ' Créer un DataTable pour afficher les résultats
    Dim resultTable As New DataTable()
    resultTable.Columns.Add("Note", GetType(String))
    resultTable.Columns.Add("Nombre", GetType(Integer))
     
    For Each item In query
        resultTable.Rows.Add(item.Note, item.Nombre)
    Next
     
    ' Afficher les résultats dans un DataGridView
    Dim dataGridView As New DataGridView()
    dataGridView.DataSource = resultTable
     
    ' Ajouter le DataGridView à votre formulaire
    Me.Controls.Add(dataGridView)
    dataGridView.Dock = DockStyle.Fill
    Je comprends le reste du code mais la ligne compter les occurrences de chaque note, c'est à dire combien d'élèves ont pour note A par exemple je n'arrive pas à cerner.

    Besoin d'éclaircissement svp.

    Merci

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 992
    Par défaut
    Citation Envoyé par Mr l'Ashanti Voir le message
    Je comprends le reste du code mais la ligne compter les occurrences de chaque note, c'est à dire combien d'élèves ont pour note A par exemple je n'arrive pas à cerner.
    Tu fais générer ton code par de l'IA.
    Pourquoi tu ne lui demandes pas aussi de te l'expliquer ?

    En lisant rapidement, le code en ligne 16 créer un IQuerable qui regroupent les notes et qui compte le nombre d'élèves ayant obtenu cette note.
    Cela avec les données en entrées cela représente ceci :
    A | 6
    B | 5
    C | 4
    D | 1

    Ensuite cela créer une grille avec ces deux colonnes.

    Le code généré par l'IA ne répond donc pas au besoin qui était de rajouter une quatrième colonne à celles de départ.
    En même temps, l'énoncé n'est pas très clair.
    Pas étonnant que l'IA ponde n'importe quoi.

    J'ai moi même du mal à le comprendre.
    'Nom' est au singulier, mais 'Matières' et 'Notes' sont au pluriel.
    Ce qui semble indiquer que pour une ligne correspondant à un élève, tu as plusieurs matières et plusieurs notes.
    Cela n'est pas logique d'avoir plusieurs matières et plusieurs notes sur la même ligne.
    Il devrait normalement y avoir au moins un table de plus, ou alors un nom devrait apparaitre autant de fois qu'il y a de matières (et par extension de notes).

    Alice | Math | A
    Alice | Math| A
    Alice | Eco | B
    Alice | Math | C
    Bob |Math | A
    Bob | Math | C
    Bob | Eco | B
    Bob [ Math | D

    Et du coup le résultat ressemblerai à ceci :
    Alice | Math | A | 2
    Alice | Math | C | 1
    Alice | Eco | B | 1
    Bob | Math | A | 1
    Bob | Math | C | 1
    Bob | Math | D | 1
    Bob | Eco | B | 1

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    700
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 700
    Par défaut
    Bonjour,
    Un début de réponse sur les requêtes :

    Dans une requête, la première étape précise la source de données à interroger.
    La clause From indique les éléments de la collection source à inspecter :
    Ici les DataRow dans la Datatable dt.

    Ensuite, la clause Group By regroupe les éléments partageant la même clé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Group By note = row.Field(Of String)("Notes") Into Group
    Ici la clé est la note que l’on trouve dans la ligne au champ Notes de chaque DataRow.
    Chaque groupe de même note est enregistré dans la variable query.

    la clause Select permet de définir comment retourner, les résultats d’une requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select New With {
        .Note = note,
        .Nombre = Group.Count
    }
    Ici est créé un nouveau type comprenant deux membres (note (string) et nombre (integer)).

    Voici comme j’interprète ce code dans l'attente d'éventuelles corrections.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 572
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 572
    Par défaut
    Tu as utilisé quelle IA et comment tu lui as posé la question?
    l'énoncé de l'exercice n'est pas franchement des plus clairs sur comment est construit la table, par exemple, si chaque ligne ne correspond qu'à un élève, est-ce que les notes correspondent à une seule matière.
    Comme on demande le nombre d'élèves qui a obtenu une note, si un élève a reçu 2 fois la note dans différentes matières, comment doit-il être comptabiliser ? une fois uniquement, ou une fois par matière?
    .....

  5. #5
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 579
    Par défaut
    Bonjour,
    Le problème quand on utilise ia on prend le risque d'avoir une réponse.

    Le problème avec ia c'est qu'il n'est pas capable de résoudre un problème au deuxième degré.

    Il faut lui demander une analyse sans code. En fait il faut lui demander un cahier des charges ça il s'est faire.

    L'exercice parle de table a trois colonnes Nom, Matières et Notes. J'en collus qu'il faut faire un requête SQL. La première question a poser à ia peut me donner la requête SQL de et tu lui exposer l'exercice précis lui que tu ne veux que la requête et pas de code.
    Nous devons compter les élèves qui on obtenu une note ??? En Provence de la table élèves.

    Select cont(nom), note from élèves groupe by note

    Deuxième question pour ia:
    Peux tu m'expliquer quelle est la méthode la plus simple pour exposer une requête SQL à un datagridview .

    Citation Envoyé par Thumb down
    Rédige-moi un cahier des charges, je veux une requête SQL avec OLEDB qui retourne directement un DataTable affecté à la RowSource du DataGridView.
    Voici l'exercice que je cherche à résoudre : soit une table Élèves comportant trois colonnes : Nom, Matières et Notes. Dans la colonne Notes, nous avons ces caractères qui représentent les notes {A, A, B, C, A, C, B, D, B, C, A, A, B, C, A, B}. Écrire une requête en VB.NET qui déterminera le nombre exact d'élèves ayant des notes pour chacun des types A, B, C et D, puis l'afficher dans un DataGridView en créant une quatrième colonne 'Nombre'."
    on voie dans la rédaction que je sais de quoi je parle!
    Citation Envoyé par ChatGpt
    Cahier des charges pour l'exercice SQL en VB.NET avec OLEDB

    1. Contexte et description du besoin


    • Objectif : Développer une fonctionnalité dans une application VB.NET qui permet de récupérer et afficher dans un DataGridView le nombre d'élèves pour chaque type de note (A, B, C, D) depuis une base de données contenant une table appelée Élèves avec les colonnes Nom, Matières et Notes.
    • Environnement de développement :
      • Langage de programmation : VB.NET
      • Base de données : Access ou toute autre base compatible avec OLEDB
      • Interface utilisateur : DataGridView pour l'affichage des résultats

    • Résultat attendu : La requête SQL doit compter le nombre d'élèves ayant une note de chaque type (A, B, C, D) et l'afficher dans un DataGridView avec une colonne supplémentaire nommée Nombre pour chaque type de note.

    2. Structure de la table Élèves


    • Nom de la table : Élèves
    • Colonnes :
      • Nom : Nom de l'élève (Texte)
      • Matières : Matière étudiée (Texte)
      • Notes : Note obtenue par l'élève (Texte avec des valeurs possibles parmi {A, B, C, D})

    3. Fonctionnalités à implémenter


    • Récupérer les données via une requête SQL avec OLEDB.
    • La requête SQL doit compter le nombre d'élèves pour chaque type de note (A, B, C, D).
    • Le résultat doit être directement injecté dans un DataTable.
    • Le DataTable doit être affecté en tant que source des lignes (DataGridView.DataSource).
    • Ajouter une colonne supplémentaire nommée Nombre dans le DataGridView pour afficher le nombre total d'élèves pour chaque type de note.

    4. Contraintes techniques


    • Langue : VB.NET avec OLEDB.
    • Base de données : Doit être compatible avec OLEDB.
    • Affichage : Utilisation de DataGridView pour afficher les résultats.
    • Requêtes SQL : Utilisation de GROUP BY pour regrouper les notes par type (A, B, C, D) et COUNT() pour compter les élèves ayant chaque note.
    • Compatibilité : Le code doit être adaptable à toute source OLEDB, et le chemin de la base de données doit être paramétrable.

    5. Étapes de réalisation


    1. Connexion à la base de données :
      • Établir la connexion à la base de données via OLEDB en utilisant une chaîne de connexion appropriée.

    2. Requête SQL :
      • Écrire une requête SQL pour compter les élèves ayant chaque type de note :SELECT Notes, COUNT(*) AS Nombre
        FROM Élèves
        WHERE Notes IN ('A', 'B', 'C', 'D')
        GROUP BY Notes
        ORDER BY Notes;

    3. Récupération des données :
      • Utiliser un OleDbDataAdapter pour exécuter la requête SQL et remplir un DataTable.

    4. Affichage dans le DataGridView :
      • Lier le DataTable au DataGridView via la propriété DataSource.

    5. Ajout d'une colonne "Nombre" :
      • La colonne Nombre sera automatiquement générée à partir du résultat de la requête SQL.

    6. Exemple de code VB.NET

    Voici un exemple de code pour réaliser cette tâche :
    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
    Imports System.Data.OleDb
     
    Public Class Form1
        Private Sub ChargerDonnees()
            ' Chaîne de connexion à adapter à votre base de données
            Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\eleves.accdb"
            Dim query As String = "SELECT Notes, COUNT(*) AS Nombre FROM Élèves WHERE Notes IN ('A', 'B', 'C', 'D') GROUP BY Notes ORDER BY Notes"
     
            ' Connexion à la base de données et récupération des données
            Using connection As New OleDbConnection(connectionString)
                Dim command As New OleDbCommand(query, connection)
                Dim adapter As New OleDbDataAdapter(command)
                Dim dataTable As New DataTable()
     
                Try
                    connection.Open()
                    adapter.Fill(dataTable)
     
                    ' Affecter le DataTable au DataGridView
                    DataGridView1.DataSource = dataTable
                Catch ex As Exception
                    MessageBox.Show("Erreur lors de la récupération des données : " & ex.Message)
                End Try
            End Using
        End Sub
    End Class
    7. Tests


    • Vérification que les données sont bien récupérées et affichées dans le DataGridView.
    • Vérification que les colonnes du DataGridView contiennent bien les types de notes (A, B, C, D) ainsi que le nombre d'élèves pour chaque type dans la colonne Nombre.

    8. Critères d'acceptation


    • La requête SQL doit correctement compter et afficher les élèves ayant chaque type de note.
    • Le DataGridView doit contenir 2 colonnes : une pour les Notes et une pour le Nombre d'élèves.
    • La solution doit être robuste et afficher un message d'erreur en cas de problème avec la base de données ou la connexion.


    Ce cahier des charges guide la mise en œuvre complète de la solution SQL dans un projet VB.NET.

  6. #6
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 992
    Par défaut
    Thumb down, même de cette manière l'IA a répondu à coté.

    Le code produit aboutit là aussi à une grille avec deux colonnes (le nombre de notes et l'élève) alors que l'énoncé dit très clairement qu'il faut en avoir quatre :
    puis l'afficher dans un DataGridView en créant une quatrième colonne 'Nombre'

  7. #7
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 579
    Par défaut
    Non ia n'a pas répondu à côté concrètement il à ajouter une quatrième colonnes nombre.

    IE n'es pas fiable car il ne voit pas plus loing que le bouton de son nez.

    Si je lui pose la question tél quel est l'exercice est rédigé j'obtiens la même réponse que notre ami.

    Je l'ai modifié pour obtenir ce résultat, je pouvais poser une autre question pour affiner sa réponse mais je ne l'ai pas fait.

    Si au bout de quatre questions il ne donne pas la bonne réponse alors là il tourne en boucle.

    J'utilise ia pour commanter le code que je rédige jamais pour "pisser du code".

    Je fais appel accessoirement pour aborder de sujet que je ne connais pas mais le code qu'il rédige mes souvenir incompréhensible. Pourtant je suis développeur informatique et pas autodidacte.

  8. #8
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 992
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    Non ia n'a pas répondu à côté concrètement il à ajouter une quatrième colonnes nombre.
    Je ne vois pas par quel miracle le résultat obtenu peut avoir quatre colonnes avec le code présenté.

    La requête SELECT Notes, COUNT(*) AS Nombre FROM Élèves WHERE Notes IN ('A', 'B', 'C', 'D') GROUP BY Notes ORDER BY Notes renvoie seulement 2 colonnes (Notes et Nombre).
    Cette requête est transmise à une commande, elle même transmise au dataadapter qui sert à remplir la datatable qui sert de source de données à la grille.
    Résultat la grille elle-même n'a que deux colonnes et pas quatre.

  9. #9
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 579
    Par défaut
    L'énoncé dit
    soit une table Élèves comportant trois colonnes
    Nous avons déjà nos 3 colonnes.
    quatrième colonne 'Nombre
    Voilà notre quatrième colonnes que nous créons a partir du count.
    Écrire une requête en VB.NET qui déterminera le nombre exact d'élèves ayant des notes pour chacun des types A, B, C et D, puis l'afficher dans un DataGridView
    Il n'est nullement question d'afficher quatre colonnes mais uniquement le nombre de {A,B,C,D} par les élèves, on parle pas du nom,et de la matière.

  10. #10
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 992
    Par défaut
    Citation Envoyé par Thumb down Voir le message
    Il n'est nullement question d'afficher quatre colonnes mais uniquement le nombre de {A,B,C,D} par les élèves, on parle pas du nom, et de la matière.
    Ceci est l'interprétation que tu as fait de cet énoncé.

    Mon interprétation à moi est qu'il faut créer une grille à quatre colonnes pour obtenir les données que j'ai placées sur mon premier message.
    Dans le cas contraire, il aurait été inutile de préciser qu'il faut ajouter une quatrième colonne et l'énoncé ce serait arrêté à "Datagridview".

    Il est à présent à la charge du PO de préciser ce qu'il en est réellement.
    Dans tous les cas, cette divergence d'interprétation démontre à elle seule qu'il n'est pas facile pour un humain de donner une réponse adaptée quand l'énoncé est ambigu.
    Alors une IA...

  11. #11
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 992
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 992
    Par défaut
    Bref, nous partons tous les deux dans des suppositions sans savoir ce qu'il en est réellement.
    Il aurait été beaucoup plus simple que Mr l'Ashanti décrive ce qu'il a en entrée et ce qu'il veux en sortie.
    Ce que je l'invite à faire, d'ailleurs.

  12. #12
    Membre Expert Avatar de Thumb down
    Homme Profil pro
    Retraité
    Inscrit en
    Juin 2019
    Messages
    1 579
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Juin 2019
    Messages : 1 579
    Par défaut
    Je suis d'accord avec toi.

Discussions similaires

  1. Requêtes imbriquées et comptage de doublons
    Par scavenger dans le forum SQL
    Réponses: 7
    Dernier message: 27/11/2012, 14h19
  2. [XL-2003] Comptage de doublons
    Par Yuki_Hime dans le forum Excel
    Réponses: 5
    Dernier message: 09/09/2012, 21h30
  3. Comptage sans doublons
    Par Bourbon Kid dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 10/11/2011, 14h00
  4. [AC-2007] Requete tables non liés : comptage avec doublons
    Par snakemetalgear dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/07/2011, 22h37
  5. Requete de comptage de doublons spéciale
    Par COliveOnTheNet dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/09/2003, 10h11

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