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

Delphi Discussion :

Problème requête SQL


Sujet :

Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut Problème requête SQL
    Bonjour à tous,
    Je suis sur ce forum, celui pour les SGBD étant fermé.
    J'utilise Delphi 10.2.2 et une BDD sous Sqlite3. Or je manque de compétence, entre autre, en SQL pour résoudre le problème suivant :
    Contexte.
    Soit une association avec un certain nombre d'adhérents situés dans un certain nombre de départements.
    - 1 couple = 1 cotisation mais 2 adhérents.
    - 1 personne seule = 1 cotisation et 1 adhérent(e).
    La requête ci-dessous fonctionne très bien mais ne me donne que le nombre de cotisations dans chaque département. Or je veux connaître le nombre d'adhérents, les couples comptant évidemment pour 2 adhérents.
    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
     
    With Datas.QAdherents do
    begin
      SQL.Clear;
      SQL.Add('SELECT Dpt, COUNT(Dpt) AS Nb, Nombre, Civilite, Nom, Prenom, Membre, Print, Adresse, Localite, Courriel, Telephone, TeleMobile, Envoi, Cotisation, Dons, Sortie, Paiement_sortie, Visite1, Repas, Visite2, Degrevement, Observations');
      SQL.Add('FROM tblAdherents WHERE Nombre <> 0 GROUP BY Dpt ORDER BY Nb DESC');
      Open;
     
      Datas.QAdherents.first;
      MemoDpt.Clear;
      While not Datas.QAdherents.Eof do
      begin
        Nb := (Datas.QAdherents.Fields[1].AsInteger);
        MemoDpt.Lines.Add('Département ' + Datas.QAdherents.FieldByName('Dpt').Value  + ' : ' + IntToStr(Nb) + ' cotisation.s');
        Datas.QAdherents.Next;
      end;
    end;
    Précision : j'ai un champ Dpt (département) et un champ Nombre (1 pour une personne seule, 2 pour un couple).
    Je me suis inspiré d'un exemple du forum. Vive le forum !
    Merci à tous et joyeuses fêtes malgré tout. Faites attention...

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par f5jcg_Lulu Voir le message
    Bonjour à tous,
    Je suis sur ce forum, celui pour les SGBD étant fermé.
    J'utilise Delphi 10.2.2 et une BDD sous Sqlite3....
    Fermé ?
    Forum > Bases de données > Autres SGBD > SQLite semblent tout à fait disponible


    Oh c'est intéressant ce GROUP BY n'a pas besoin contenir tous les champs non agrégés du SELECT ?
    C'est pas courant ! dans plein de SGBD cela ne fonctionnerait pas

    Vu que la table c'est les adhérents, un champ doit indiquer un lien avec le contrat de cotisation (le champ Cotisation c'est un montant ?) ou un adhérents 'Principal' qui fait hériter son adhérents 'Secondaire'
    Mais si cela retourne que le nombre de cotisation par département depuis la table adhérents, il y a un problème de structure de table
    Comment sont gérer les cotisations, la date de paiement, le renouvellement ...
    Et ce champ Nombre, c'est le nombre de personne ? SUM(NOMBRE) au lieu de COUNT ?

    Pourquoi tous ces champs dans le SELECT si vous ne souhaitez avoir que deux colonnes ?
    Il est toujours préférables de ne récupérer QUE ce qui est utile dans votre cas le DPT et le SUM ou COUNT, le reste est inutile (voir faux avec le GROUP BY)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    469
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 469
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour

    Il m'étonnerait que cette requête fonctionne. Je n'utilise pas SqlLite, mais je sais qu'elle est erronée au regard de la norme SQL.

    En effet, en SQL, si il y a un GROUP BY, on ne peut mettre derrière le SELECT soit le(s) champ(s) indiqués après le GROUP BY, soit des expressions statistiques telles que COUNT(*).
    Donc les champs Nom, Prenom, etc ... devraient provoquer une erreur (ou alors SqlLite est en dehors de la norme SQL et je me demande bien ce qu'il peut retourner)

    Pour répondre à ta question, tu pourrais peut-être essayer plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Dpt, COUNT(*) AS Nb_cotisations, SUM(Nombre) as Nb_adherents FROM tblAdherents WHERE Nombre <> 0 GROUP BY Dpt ORDER BY Nb_adherents DESC;

    Joyeux Noël !
    Cordialement,
    Tintinux

    Initiateur de Gestinux, une comptabilité gestion open-source, pour Linux, Windows et Mac OS.
    Une version stable et une autre en développement, avec Lazarus : vous pouvez aider à la tester, la traduire et à la développer.

  4. #4
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut
    Merci à tous les deux pour vos réponses et désolé, j'ai cru que le forum SGBD était fermé comme indiqué quand j'ai voulu y entrer.
    Cette requête fonctionne bien pourtant et retourne les résultats qu'elle doit retourner, même si je n'ai pas tous les résultats attendus.
    Si je ne spécifie pas tous les champs c'est là que j'ai un message d'erreur ! C'est vrai qu'avec un GROUP BY...
    Les champs Cotisation et Nombre sont des nombres car je fais des calculs avec. Et c'est vrai que je n'ai pas besoin de tous les champs pour un affichage somme toute restreint. Je vais essayer la proposition de Tintinux et passer Noël dessus.

    PS : je viens d'essayer, on me réclame toujours toute la série des champs...

    Quoi qu'il en soit merci beaucoup et à bientôt.
    Amicalement. Joyeux Noël à tous

  5. #5
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut
    Bingo, la solution de Tintinux fonctionne. La requête me renvoie bien ce que je désirais dans ma demande. C'est décidément Noël !
    Merci et encore joyeux Noël à tous

  6. #6
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut Problème requête SQL
    Bonjour à tous,
    Je reviens à mon problème précédent, qui a été résolu par Tintinux, je l'en remercie.
    Il y a tout de même une anomalie : pourquoi suis-je obligé de lister dans la requête TOUS les champs de la table bien que seuls 2 ou 3 soient "utiles" pour ce traitement ? Quand je supprime ces champs j'ai un message SQL error me les réclamant l'un après l'autre. Cela alourdit la requête et me paraît anormal. Où ai-je fait l'erreur ?
    A noter que telle que ci-dessous tout fonctionne, j'ai les bons résultats.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    With Datas.QAdherents do
    begin
      SQL.Clear;
      SQL.Add('SELECT Dpt, COUNT(*) AS Nb_cotisations, SUM(Nombre) AS Nb_adherents, Nombre, Civilite, Nom, Prenom, Membre, Print, Adresse, Localite, Courriel, Telephone, TeleMobile, Envoi, Cotisation, Dons, Sortie'); //, Paiement_sortie, Visite1, Repas, Visite2, Degrevement, Observations');
      SQL.Add('Paiement_sortie, Visite1, Repas, Visite2, Degrevement, Observations FROM tblAdherents WHERE Nombre <> 0 GROUP BY Dpt ORDER BY Dpt');
      Open;
    Merci pour votre aide une fois de plus, mais vu que tout fonctionne il n'y a pas d'urgence.
    Cordialement

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Vérifier que Datas.QAdherents ne soit pas attaché à des Champ Persistants (voire même DataSource + DBGrid)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Membre régulier
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2019
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Janvier 2019
    Messages : 176
    Points : 79
    Points
    79
    Par défaut
    Merci pour la piste, ShaiLeTroll, je vais vérifier la persistence des ces champs. Je mets en résolu en attendant.
    Cordialement

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

Discussions similaires

  1. Problème requête SQL
    Par mandaillou dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/10/2005, 11h37
  2. Problème requête SQL dans page ASP
    Par rocs dans le forum ASP
    Réponses: 14
    Dernier message: 26/07/2005, 15h38
  3. problème requête sql
    Par psychoBob dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/07/2005, 17h50
  4. problème requête sql
    Par perfectdams dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 21/06/2005, 18h09
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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