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 :

Calcul opérations comptables avec solde de départ


Sujet :

Langage SQL

  1. #1
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut Calcul opérations comptables avec solde de départ
    Bonjour,

    quelquefois les choses les plus simples semblent les plus compliquées ...

    J'ai une table "Compta_Compte" et une table "Compta_Operations"

    Dans Compta_Compte:

    CO_ID Co_Nom Co_Solde_depart
    1 Banque 1500
    2 Poste 350
    3 Caisse 500
    4 Banque_2 2000
    et la table Compte_Operations

    OP_ID OP_Compte OP_ENTREE OP_SORTIE
    1 1 320
    2 2 120
    3 2 25
    4 3 50
    5 3 250
    (il n'y a pas de date pour simplifier)

    J'essaie de trouve la requête qui me permettrai de trouver le solde des comptes, sachant que :

    - le solde doit être la somme des entrée - la somme des sorties + le solde de départ soit :

    1 Banque 1820
    2 Poste 255
    3 Caisse 700
    4 Banque_2 2000

    Y compris Banque_2 qui n'a pas d'opération ...

    Une idée, je suppose que ça doit être faisable en SQL , je tourne et retourne les left join et les SUM() sans y arriver ...

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select  cpt.co_nom
        ,   max(cpt.co_solde_depart)
        +   coalesce(sum(ope.op_entree), 0)
        -   coalesce(sum(ope.op_sortie), 0) as  solde
    from    compta_compte       as  cpt
        left join
            compte_operations   as  ope
            on  ope.op_compte   = cpt.co_id
    group by cpt.co_nom
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    Bonjour,

    merci beaucoup pour l'aide !

    Malheureusement je planche encore dessus ... ( bon je suis sous Windev ... ça n'aide pas en SQL ...)

    Il semble que ce n'est pas possible de faire des MAX() + SUM() en Windev , mais ce n'est pas trop grave si je peux récupérer les infos par ligne

    Mais si je fais ( donc sans condition )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT  
    	Compta_Compte.Co_ID AS Co_ID,
    	Compta_Compte.Co_Nom AS Co_Nom,	
    	SUM(Compta_Operations.Op_Entree-Compta_Operations.Op_Sortie) AS Solde,
        MAX(Compta_compte.Co_Solde_Depart) AS Depart
    FROM 
    	Compta_Compte LEFT JOIN Compta_Operations ON  Compta_Compte.Co_ID = Compta_Operations.Op_Compte
     
    GROUP BY 
    	Compta_Compte.Co_ID,Compta_Compte.Co_Nom
    J'ai toutes mes lignes, y compris le compte qui n'a jamais été utilisé :

    Nom : img_1.png
Affichages : 99
Taille : 14,2 Ko

    Mais si je mets un condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT  
    	Compta_Compte.Co_ID AS Co_ID,
    	Compta_Compte.Co_Nom AS Co_Nom,	
    	SUM(Compta_Operations.Op_Entree-Compta_Operations.Op_Sortie) AS Solde,
        MAX(Compta_compte.Co_Solde_Depart) AS Depart
    FROM 
    	Compta_Compte LEFT JOIN Compta_Operations ON  Compta_Compte.Co_ID = Compta_Operations.Op_Compte
    WHERE
        Compta_Operations.Op_Date < 20210331
     
    GROUP BY 
    	Compta_Compte.Co_ID,Compta_Compte.Co_Nom
    Je perds mon compte inutilisé ...

    Nom : img_2.png
Affichages : 104
Taille : 14,1 Ko

    En fait je voudrai pouvoir mettre des conditions pour trouver :

    - solde des comptes a la date X :

    Solde de départ + (entree - sortie) dont les opération sont antérieures à la date X

    Je tourne en rond pour un truc que je pensais réglé en 10 minutes .... des idées ?

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    En plaçant la condition Compta_Operations.Op_Date < 20210331 dans la clause WHERE, tu exclus les lignes pour lesquelles Compta_Operations.Op_Date IS NULL donc les comptes qui n'ont pas d'opérations. Il faut déplacer cette expression dans la condition de jointure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT  Compta_Compte.Co_ID AS Co_ID
        ,   Compta_Compte.Co_Nom AS Co_Nom
        ,	SUM(Compta_Operations.Op_Entree-Compta_Operations.Op_Sortie) AS Solde
        ,   MAX(Compta_compte.Co_Solde_Depart) AS Depart
    FROM 	Compta_Compte
        LEFT JOIN 
            Compta_Operations
            ON  Compta_Compte.Co_ID = Compta_Operations.Op_Compte
            AND Compta_Operations.Op_Date < 20210331
    GROUP BY Compta_Compte.Co_ID
        ,   Compta_Compte.Co_Nom
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre confirmé Avatar de wd_newbie
    Homme Profil pro
    Développeur
    Inscrit en
    Mars 2007
    Messages
    723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 723
    Points : 627
    Points
    627
    Par défaut
    J'ai un peu honte de l'avouer ... mais je n'ai jamais utilisé autre chose que le lien direct entre les tables dans la condition ON des jointures ...
    et ne savais même pas que l'on pouvais le faire ... et ne l'avais jamais remarqué dans les multiples exemples visités.



    Un grand merci pour ton aide !

    C'est résolu !

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Et pourtant, une façon parmi d'autres de faire un produit cartésien est la suivante :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [...]
    FROM T1
    JOIN T2
      ON 1=1
    La condition ne porte sur aucune colonne des deux tables et elle est toujours vérifiée, d'où produit cartésien

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

Discussions similaires

  1. [MPD] Opération comptable avec 2 tables filles CREDIT et DEBIT
    Par cadao dans le forum Schéma
    Réponses: 44
    Dernier message: 20/01/2012, 19h53
  2. Réponses: 9
    Dernier message: 02/05/2006, 21h17
  3. formule de calcul du TRI avec PL/SQL
    Par mongilotti dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 30/07/2005, 20h23
  4. composant de calcul [champ date] avec rave report
    Par segnac dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/06/2005, 19h08
  5. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02

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