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 :

[FireBird] Requête portant sur une saison parmi plusieurs


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2002
    Messages : 172
    Points : 101
    Points
    101
    Par défaut [FireBird] Requête portant sur une saison parmi plusieurs
    Le code devrait renvoyer les individus dont les versements sont supérieurs à la dette pour une saison donnée.
    Or il compare la somme due à celle réglée en 2005/2006....et non 2006/2007
    Si vous aviez une solution...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Select
          ind.ind_nom, ind.ind_prenom, ins.ins_ind_id, (ins.INS_VAL_LIC+INS.INS_VAL_COT) AS DU,
          sum( ver.ver_somme) as VERSE, ins.ins_saison
          from   T_INDIVIDU_IND ind, T_INSCRIPTION_INS ins, T_VERSEMENT_VER ver
          where ver.ver_ind_id =ins.ins_ind_id
          and ind.ind_fon= 'PRATIQUANT'
          and ins.ins_ind_id =ind.ind_id
          and ins.ins_saison= '2006/2007'
          and ins.ins_section= 'AIKIDO'
          and ver.ver_valid= 'OUI'
          Group by  ind.ind_nom, ind.ind_prenom, ins.ins_ind_id,ins.INS_VAL_LIC,INS.INS_VAL_COT, ver.ver_valid,ins.ins_saison
          Having sum( ver.ver_somme)> (ins.INS_VAL_LIC+INS.INS_VAL_COT)
          ORDER by IND.ind_nom

  2. #2
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Bonjour,

    Apparement tu fais une laison entre la table versement et la table individu.
    Tu comptabilise donc tous les versements d'un individu sans les restreindre à une saison donnée.

    a+

  3. #3
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Précision :

    Ta requête serait certainement plus lisible si tu faisait tes liaisons via l'opératuer JOIN et tes restrictions dans le where. Sous fireBird elle serait peut être même plus performante ainsi :

    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
     
    Select ind.ind_nom, ind.ind_prenom, 
     
             ins.ins_ind_id, (ins.INS_VAL_LIC+INS.INS_VAL_COT) AS DU,
             ins.ins_saison,
     
             sum( ver.ver_somme) as VERSE,
     
      from T_INDIVIDU_IND ind
       join T_INSCRIPTION_INS ins on ins.ins_ind_id =ind.ind_id
       join T_VERSEMENT_VER ver ver.ver_ind_id =ins.ins_ind_id
    where ind.ind_fon= 'PRATIQUANT'
     
       and ins.ins_saison= '2006/2007'
       and ins.ins_section= 'AIKIDO'
     
        and ver.ver_valid= 'OUI'
     
    Group by  ind.ind_nom, ind.ind_prenom, ins.ins_ind_id, ins.INS_VAL_LIC, INS.INS_VAL_COT, ver.ver_valid, ins.ins_saison
     
    Having sum( ver.ver_somme)> (ins.INS_VAL_LIC+INS.INS_VAL_COT)
     
    ORDER by IND.ind_nom
    a+

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2002
    Messages : 172
    Points : 101
    Points
    101
    Par défaut
    Merci Yourk pour la clarté du code, j'avais aussi besoin de ce genre de propreté...

    quant au résultat, il est identique
    le serveur renvoie une personne qui n'a rien réglé en 2006/2007, c'est exact
    mais il prend en compte ce qu'elle a payé en 2005/2006....
    Ce qui évidemment n'est pas mon but.

    Je souhaite comparer ce qui a été versé et ce qui est dû pour contrôler dans ce cas qui a trop versé.

  5. #5
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par Lucien
    mais il prend en compte ce qu'elle a payé en 2005/2006....
    Ce qui évidemment n'est pas mon but.
    Bien sur c'est ce que je t'ai dit dans ma première réponse.
    A toi d'éviter qu'il prenne en compte un versement de 2005/2006 mais là franchement je ne connais pas ta base.
    Probablement as-tu dans ta base une date de versement ou du moins une date d'affectation du versement.
    En effet quelqu'un qui verse en 2006/2007 peux effectuer un versement de retard pour la saison 2005/2006, il te faut donc restreindre à la date d'affectation du versement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    and ver.ver_saison= '2005/2006'
    ...
    group by ...
    ...
    Maintenant ton modèle de donnée dispose-t-il de cette information ?

    a+

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2002
    Messages : 172
    Points : 101
    Points
    101
    Par défaut
    Voici la structure de la table Tversement_ver,
    Il me semblait que "Sum" respecterait la restriction de saison...?
    Mais il n'en est rien...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE T_VERSEMENT_VER (
        VER_ID           D_ID NOT NULL,
        VER_IND_ID       D_ID NOT NULL,
        VER_IND_SECTION  D_SECTION,
        VER_SOMME        D_EURO DEFAULT 0,
        VER_MODE         D_CHAINE_32,
        VER_SAISON       D_SAISON,
        VER_VALID        D_OUI_NON,
        VER_DATE_VALID   D_DATE,
        VER_NRO          D_CHAINE_32 COLLATE FR_FR
    );
     
    ALTER TABLE T_VERSEMENT_VER ADD PRIMARY KEY (VER_ID);

  7. #7
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Binjour,
    N'ai-je pas déjà répondu ?

    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
    Select ind.ind_nom, ind.ind_prenom,
    
             ins.ins_ind_id, (ins.INS_VAL_LIC+INS.INS_VAL_COT) AS DU,
             ins.ins_saison,
    
             sum( ver.ver_somme) as VERSE,
    
      from T_INDIVIDU_IND ind
       join T_INSCRIPTION_INS ins on ins.ins_ind_id =ind.ind_id
    left join T_VERSEMENT_VER ver ver.ver_ind_id =ins.ins_ind_id 
                                       and ver.ver_saison=ins.ins_saison
    where ind.ind_fon= 'PRATIQUANT'
    
       and ins.ins_saison= '2006/2007'
       and ins.ins_section= 'AIKIDO'
    
       and ver.ver_valid= 'OUI'
    
    Group by  ind.ind_nom, ind.ind_prenom, ins.ins_ind_id, ins.INS_VAL_LIC, INS.INS_VAL_COT, ver.ver_valid, ins.ins_saison
    
    Having sum( ver.ver_somme)> (ins.INS_VAL_LIC+INS.INS_VAL_COT)
    
    ORDER by IND.ind_nom
    1 - tu sélectionne un individu, une saison et une section
    2 - tu joins toutes les saisons de l'individu.
    et c'est là que ça ne va pas, il ne faut joindre que la saison de l'individu qui t'interesse. Attention il faut faire une jointure gauche (LEFT) parce que si l'individu n'a pas encore versé cette saison alors il ne ressortirai pas.

    a+

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    172
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Mars 2002
    Messages : 172
    Points : 101
    Points
    101
    Par défaut
    Bonjour Yurck,

    Si tu avais répondu....mais je n'avais pas compris,
    comme dans toute communication il faut être deux !

    Merci encore car grâce à toi le problème immédiat est résolu
    mais bien plus ceux à venir...il me faut potasser les notions de gauche et de droite qui m'échappent complétement.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 12/12/2008, 06h56
  2. [MySQL] requête avec une contrainte d'exclusion portant sur une liste de valeurs
    Par vincounet dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/08/2008, 14h54
  3. Liste modifiable sur une requête parmi plusieurs
    Par curt dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 18/05/2008, 22h44
  4. Requete: calculer un minimum portant sur une autre table
    Par icare_1er dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 09/07/2007, 21h15
  5. [SQL2K][TSQL] Trouver les indexs portant sur une colonne
    Par maitrebn dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 29/08/2006, 23h09

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