Soustraction dans une requete

Résolu
Bonjour,

je souhaite faire la soustraction de deux lignes dans une meme colonne, est-ce possible dans Access ?
cest pour gerer des releves de compteurs d'eau et calculer le prix a payer par chaque personne de l'immeuble,

jusqu'a maintenant je faisais ca dans excel, assez facile à manipuler, mais je voudrais automatiser cette tache de facon a editer une facture par personne à la date du releve(etat)

mon exemple de requete
nomresident date releve indice compteur consommation prix m3 prix total
dupond 10/01/2018 220
dupond 10/03/2018 225 5 3,00 15,00
dupond 10/05/2018 233 8 3,10 24,80

la colonne consommation, je voudrais faire le calcul une ligne(indice compteur) moins la precedente, le prix M3 je le saisis, et le prix total se calculera tout seul.

merci bien à ceux qui pourront m'aider, je manipule access mais pour des choses simples, style somme, totaux, moyenne, etc

Marie

4 réponses

Résumé de la discussion

La problématique porte sur la création d'une requête Access permettant de calculer la consommation en delta entre deux relevés dans une même colonne et de générer automatiquement le prix total. Des échanges techniques proposent d'utiliser des sous-requêtes et des jointures pour obtenir la date précédente et calculer le delta d'indice compteur par nom de copropriété, puis d'intégrer le prix par M3. Des conseils pratiques soulignent aussi l'usage des noms de champs comportant des espaces via des crochets et l'importance de choisir la meilleure approche entre requête simple et sous-requêtes imbriquées. En parallèle, certains indiquent qu'externaliser les tarifs dans une table dédiée simplifie les calculs et qu'il est possible d'apprendre le SQL progressivement pour automatiser la facturation et l'état des relevés.

Bobot (l’IA à votre service)
  1. Contributeur
    bonsoir marie, suggestion de requête:
    select c.compteur, cc.dt as du , c.dt as au,  c.val-cc.val as delta
    from cpt as c,
     (SELECT c1.compteur, c1.dt,  min(c2.dt) as mindt2 , c1.val
    FROM cpt as c1, cpt AS c2
    where c1.compteur=c2.compteur and c1.dt < c2.dt
    group by c1.compteur, c1.dt, c1.val
    ) as cc
    where c.compteur=cc.compteur and c.dt=cc.mindt2
    order by c.compteur, cc.dt
    0
    1. Bonjour yg_be
      Merci bcp de mavoir repondu.... euh ... comment dire ? Jai limpression de voir des hiéroglyphes. ... mdr.... tout ce texte je lecris ou svp ?
      0
    2. Contributeur
      @debutante66peux-tu partager ton fichier?
      0
    3. bonjour
      comment dois je faire pour joindre ma base ? jai fait une copie

      sinon jai essayé ta proposition,
      dans la requete je me suis mise en mode sql et jai copié collé ta formule, il me met le message suivant :
      objet trouvé après instruction sql

      jaimerais apprendre à le faire ,

      merci de ta patience
      0
    4. Contributeur
      @debutante66si tu veux apprendre et donc es prête à bricoler, n'envoie pas ton fichier pour le moment.
      as-tu remplacé le texte complet par le texte sql que j'ai proposé?
      souvent, en cas d'erreur, le texte erroné est surligné, ou le curseur se trouve proche de l'erreur.
      quand la requête fonctionnera, tu pourras soit l'enrichir, soit l'utiliser comme source dans d'autres requetes.
      0
    5. oui je veux bien bidouiller ... mdr
      je viens de remplacer le texte complet par le tien et cela me donne :
      le moteur de bases de donnees microsoft acccess ne peut pas trouver la table ou la requete source "cpt" assurez vous qu elle existe et qu elle est correctement orthographiee.

      pour info, ma requete s'appelle "calcul consommation"
      et mes champs : "nom copro", "date relevé" et "indice compteur".
      faudrait peut etre que j'adapte certains mots à ma requete dans ton texte ? mais lesquels ?
      0
  2. bonjour
    a ma connaissance mais tu peux faire 2 colonnes ancien indice et nouvel indice
    faire la soustraire dans une troisieme
    0
    1. Bonjour Castours.
      Je retiens ton idee si toutefois je narrive pas a faire comme je le souhaite..... ce qui mennuie en ayant une double saisie cest autant de possibilité d erreurs... bon we de pentecote
      0
  3. Contributeur
    ou bien:
    SELECT c.compteur, c.dt, c.val, c.val-cc.val AS delta, M3, M3*(c.val-cc.val) AS prix
    FROM cpt AS c 
    LEFT JOIN
     (SELECT c1.compteur, c1.dt, c1.val, min(c2.dt) AS suiv FROM cpt AS c1, cpt AS c2 
    WHERE c1.compteur=c2.compteur and c1.dt < c2.dt 
    GROUP BY c1.compteur, c1.dt, c1.val)  AS cc 
    ON (c.dt=cc.suiv) AND (c.compteur=cc.compteur)
    ORDER BY c.compteur, cc.dt;
    0
    1. je viens de mettre ton texte et il me renvoie toujours le meme message d erreur .

      moi je crois que je dois adapter avec le nom reel de mes champs mais je ne vois pas ou ?
      que veut dire c.compteur ? c.dt ? c.val ? c1 ? c2 ? cc.compteur ?
      comme je ne connais pas le langage sql je suis un peu perdue

      comment je peux faire pour t'envoyer mon fichier ?
      0
    2. Contributeur
      @debutante66cette nouvelle requête doit être adaptée à tes noms, en effet. je pense qu'elle te donnera un résultat plus proche de ce que tu attends (par rapport à la requête initiale que je t'ai proposée).
      je n'utilise pas le fichier que tu as envoyé, je pense que tu apprendras plus si tu fais toi-même. tout m'indique que tu vas bientôt y arriver.
      0
  4. Contributeur
    tout autre chose: je pense mieux d'avoir un champ [no copro] au lieu de [Nom Copro] dans la table [saisie des compteurs].
    0