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 :

[SQL] Requête complexe avec appel multiple à la même table


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2004
    Messages : 159
    Points : 131
    Points
    131
    Par défaut [SQL] Requête complexe avec appel multiple à la même table
    Bonjour,

    Après avoir tourné en rond un bon moment avec des tests infructueux, j'aimerais savoir si ce que je souhaite réaliser en SQL est possible.

    En gros j'ai une table (T_RES) qui contient des montant mensuels et une autre les montants cumulés (tbl_Montant_courus).
    Je dois mettre à jour les montants courus de la table T_RES (4 champs) en mettant comme valeur le résultat d'un calcul qui utilise un des champs de T_RES et un champs de tbl_Montant_courus pris sur deux enregistrements différents (un enregistrement pour le mois en cours et un pour le mois précédent afin de "décumuler" les montants).

    J'imaginais pouvoir faire un update avec une sous-requête, mais je n'ai trouvé aucun exemple de ce type de synthaxe dans les bouquins de SQL dont je dispose.

    Est-ce que ce type de manip est possible ou faut-il que je la scinde en plusieurs requêtes ?

    Merci d'avance pour vos réponses.

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Hummmmmmmmmmm
    Ma boule de cristal me dit que "OUI, c'est possible", mais bon il ne faut pas toujours faire confiance aux boules de cristal, alors donne nous un peu plus d'informations sur les tables mises en cause, le type de calcul que tu veux faire, etc., et nous pourons peut-être t'aider de façon plus efficace
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  3. #3
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2004
    Messages : 159
    Points : 131
    Points
    131
    Par défaut
    Aïe, tu prends des risques avec ce genre de proposition

    J'ai une table T_RES qui contient :
    Une clé sur deux champs :
    - NOPREST
    - TYPREST
    et des montants mensuels, 4 dont la valeur est mise à jour directement à partir des données sources :
    1/ INT EFF DEB
    2/ INT EFF CRE
    3/ RECUP PORT
    4/ RECUP TAXE
    et 4 qui sont calculés à partir de montants cumulés sur l'année dans les données sources :
    1/ INT COUR DEB
    2/ INT COUR CRE
    3/ RECUP PORT COURUS
    4/ RECUP TAXE COURUS


    Je gère les montants cumulés grâce à une une table tbl_Montant_courus qui les stockent au fur et à mesure. Cette table contient :
    Les deux champs clé de l'autre table: mc_NOPREST, mc_TYPREST
    auxquels j'ai rajouté les champs mc_Annee et mc_Mois pour obtenir une clé unique.
    Par ailleurs, cette table contient un champ pour chaque montant cumulé :
    1/ mc_INT_COUR_DEB
    2/ mc_INT_COUR_CRE
    3/ mc_RECUP_PORT_COURUS
    4/ mc_RECUP_TAXE_COURUS

    La formule de calcul est toujours la même. Pour les 4 champs elle prend la forme :
    Montant couru mensuel = Montant couru cumulé (mois m) - Montant couru cumulé (mois m-1) + Montant effectif mensuel (mois m)

    Les montants courus étant donc stockés dans tbl_Montant_courus et les montants effectiufs dans T_RES qui est la table qui doit être mise à jour.

    Voilà. J'espère avoir été assez clair.
    Je ne cherche pas à avoir le code direct mais juste qu'on me mette sur la voie au niveau de la synthaxe.
    En gros mettre à jour en même temps plusieurs champs dans une table à partir de données provenant de la table et d'une sous-requête liée.

    J'ai juste oublié que dans la sou-requête, il faut une jointure externe vu qu'il est possible qu'une prestation soit présente au mois m et n'ai pas de données pour le mois m-1...

  4. #4
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE T_REST r
    SET INT_COUR_DEB = INT_EFF_DEB + (SELECT ... FROM...)
    WHERE ...
    Le SELECT est une double jointure externe sur le table cumulée (attention à transformer les NULL en 0)

    Je n'ai pas compris comment était déterminé le mois à prendre en compte (la date courante ?)
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  5. #5
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2004
    Messages : 159
    Points : 131
    Points
    131
    Par défaut
    Ouaip, mais si à chaque fois que j'utilise le résultat de la sous-requête (4*2 fois au total) elle doit être relancée, je vais avoir une requête de folie à la sortie (sans compter la longueur du code).

    Je pense que je vais plutôt scinder tout cela en plusieurs requête, ce sera plus simple.

    Merci de ton aide.

    Je profite lachement de ta gentillesse, mais tu m'as averti d'un risque dans ton message (remplacer les null par 0 sur la double jointure externe).
    J'avais bien vu ce risque, mais je n'arrive pas à passer outre.
    J'ai tapé le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT T.mc_NOPREST
         , T.mc_TYPREST
         , T.[mc_INT_COUR_DEB]-IIf(IsNull(T1.[mc_INT_COUR_DEB]),0,(T1.[mc_INT_COUR_DEB])) AS MENS_INT_DEB
    FROM tbl_Montant_courus AS T
      LEFT JOIN tbl_Montant_courus AS T1 
        ON  T.mc_Annee = T1.mc_Annee 
        AND T.mc_NOPREST = T1.mc_NOPREST 
        AND T.mc_TYPREST = T1.mc_TYPREST
    WHERE T.mc_Mois=[Mois]
      AND (T1.mc_Mois=[Mois-1] OR isnull(T1.mc_Mois));
    et j'obtiens 6764 ligne alors que la table T_RES en contient 6888.
    Vois-tu une erreur de logique/synthaxe dans mon code ?
    (Je suis désolé, c'est fondé sur de l'access, mais c'est le seul SGBD que nos administrateur ont bien voulu nous donner )

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Es-tu sûr qu'il existe toujours T.mc_Mois=[Mois] ?
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  7. #7
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2004
    Messages : 159
    Points : 131
    Points
    131
    Par défaut
    Yep, c'est ma table debase et mois fait partie de la clé.
    En plus j'ai obtenu le nb de lignes en faisant justement un filtre suzr ce champ (entre autre)

  8. #8
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Qu'est-ce que tu obtiens en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(*)
    FROM tbl_Montant_courus 
    WHERE mc_Mois =[Mois] 
      AND mc_Annee =[Annee]
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  9. #9
    Membre habitué
    Inscrit en
    Août 2004
    Messages
    159
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Août 2004
    Messages : 159
    Points : 131
    Points
    131
    Par défaut
    C'est ce que j'avais fait pour déterminer le nb de lignes.
    En fait l'erreur vient d'un truc stupide, les données ont été chargées à partir d'un fichier qu'un collègue à généré et il a laissé des montants à null.

    Du coup toutes les opérations où un de ces montants était pris en compte renvoyaient une valeur null.
    Comme avant on utilisait des fichiers de données source que je générais en prenant soin de remplacer les valeurs null par 0 je n'ai pas pensé à regarder ce point.

    Honte à mois.

    Une fois l'alimentation des données réparée, le système fonctionne.

    Merci de ton aide.

    P.S. : Personne n'a une corde d'occasion ou une bouteille de gaz, j'ai une soudaine envie de me suicider moi

  10. #10
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Et comme cela, ça va ?


    L'important c'est que cela marche
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

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

Discussions similaires

  1. [SQL] Requête complexe sur plusieurs tables
    Par BFH dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/09/2007, 16h21
  2. [SQL] Requête delete avec datetime comme clé
    Par gostbuster dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 18/07/2007, 09h06
  3. [MySQL] requête avec jointure sur la même table
    Par gwena54 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 08/05/2007, 11h22
  4. Requêtes avec liaison sur la même table
    Par jessenco dans le forum Requêtes
    Réponses: 10
    Dernier message: 15/01/2007, 01h10
  5. [SQL] Requête complexe: syntaxe
    Par Pahcixam dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 24/08/2006, 17h48

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