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

Requêtes MySQL Discussion :

Je n'ai pas la première idée de la requête qui pourrait faire ça.


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Inscrit en
    Mai 2009
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 512
    Points : 131
    Points
    131
    Par défaut Je n'ai pas la première idée de la requête qui pourrait faire ça.
    Bonsoir tout le monde, et bonne année.

    Je ne sais même pas si c'est possible. Voilà : j'ai une table MySQL qui contient les écritures d'une comptabilité. Chaque ligne contient entre autre soit un débit, soit un crédit, et une date de valeur. Il peut y avoir des jours sans écriture, ou plusieurs écriture par jour.

    La requête mystère donnerait le solde du compte au jour le jour.

    Je suppose qu'il faut une sous-requête qui donne le cumul par jour, puis la requête principale fait le cumul : je ne sais pas faire.

    Merci de me communiquer vos idées, si vous le voulez bien.

    AMIcalement.

  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 789
    Points
    30 789
    Par défaut
    Avec quelle version de MySQL ?
    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 habitué
    Inscrit en
    Mai 2009
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 512
    Points : 131
    Points
    131
    Par défaut
    Bonsoir.

    Est-ce que ceci, prélevé sur mon écran PHPMyAdmin, répond à ta question ?
    Serveur : Localhost via UNIX socket
    Type de serveur : MySQL
    Version du serveur : 5.7.25-0ubuntu0.18.04.2 - (Ubuntu)
    Version du protocole : 10
    Utilisateur : yves@localhost
    Jeu de caractères du serveur : UTF-8 Unicode (utf8)

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    Faut-il aussi une ligne pour les jours pour lesquels il n'y a aucune ecriture ?

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Si vous n'avez pas besoin des dates sans écriture, avec une table "TAB1" composée des colonnes suivantes
    ccpt = numéro de compte comptable
    cdat = date du mouvement
    cmnt = montant signé

    et compte tenu de votre version MySQL qui ne supporte malheureusement pas les fonctions OLAP

    vous pouvez utiliser une requête comme suit :

    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
    select s1.ccompte    
         , s1.cdate
         , s2.csolde
         , s1.csolde
    from (select ccpt as ccompte
               , cdat as cdate
               , sum(cmnt) as csolde
          from tab1
          group by ccpt, cdat
         ) as s1
    inner  join
         (select ccpt as ccompte
               , sum(cmnt) as csolde
          from tab1
          group by ccpt
          ) as s2
      on s2.ccompte = s1.ccompte
    order by s1.ccompte
           , s1.cdate
    Si vous optez pour la V8 de MySQL, vous aurez des solutions plus simples

    Enfin, si vous avez besoin de toutes les dates, y compris celles sans écriture, alors il faut reprendre cette solution et utiliser une jointure OUTER d'un calendrier des dates qui vous intéressent avec la requête ci-dessus


    Exemple de jeu d'essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    0050, '2019-01-05',  150.00    
    0100, '2019-01-06', -200.20    
    0100, '2019-01-06',  082.50    
    0060, '2019-01-08',  171.63    
    0050, '2019-01-09',  310.20    
    0050, '2019-01-09',  020.00    
    0100, '2019-01-11',  196.77    
    0060, '2019-01-11', -070.00

    et de résultat obtenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ccompte 	cdate 	csolde 	csolde
    50 	2019-01-05 	480.20 	150.00
    50 	2019-01-09 	480.20 	330.20
    60 	2019-01-08 	101.63 	171.63
    60 	2019-01-11 	101.63 	-70.00
    100 	2019-01-06 	79.07 	-117.70
    100 	2019-01-11 	79.07 	196.77

    EDIT juste pour vous motiver à installer (si possible) la v8, la requête ci-dessous utilisable en v8 seulement, donne exactement le même résultat, c'est quand même bien plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select ccpt
         , cdat
         , sum(cmnt) 
           over(partition by ccpt) 
           as solde_J
         , sum(cmnt)
           over(partition by ccpt 
                order by ccpt, cdat
                rows between unbounded preceding and current row)
           as solde_d
    from tab1

Discussions similaires

  1. [PostgreSQL] première ligne d'une requête qui ne s'affiche pas
    Par Leehan dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/06/2019, 09h08
  2. Réponses: 2
    Dernier message: 29/02/2008, 08h06
  3. Réponses: 3
    Dernier message: 15/01/2008, 12h45
  4. Congés ou pas la première année après embauche?
    Par Asdorve dans le forum Congés
    Réponses: 30
    Dernier message: 18/12/2006, 15h49
  5. [MySQL] Update ne fonctionnant pas à la première exécution
    Par isa150183 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 10/11/2006, 18h25

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