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 :

Requête pour calculer la somme de chaque caissier ?


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Février 2023
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 24
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2023
    Messages : 18
    Points : 22
    Points
    22
    Par défaut Requête pour calculer la somme de chaque caissier ?
    Bonjour tout le monde, vous êtes prié de bien vouloir m'aidez concernant une requette qui me renvoie le somme encaissé seulement par le caissier (Admin) avec le total de tous les autres caissier ,
    comme suit : admin | 1800

    alors le resultat que je veux chaque caissier avec sa somme sum() : à savoir admin | 1000 , caisse1 | 400, caisse2 | 400

    Mes table sont les suivantes:

    tbl_spaiement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    montant |   user     | statut  | moment 
    500        | admin   | Payé     | 2024-01-12 00:36:12
    200        | caisse1 | Payé     | 2024-01-12 00:36:12
    200        | caisse2 | Payé     | 2024-01-12 00:36:12

    tbl_tpaiement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    montant |   user    | statut | moment
    500        | admin   | Payé     | 2024-01-12 00:36:12
    200        | caisse1 | Payé     | 2024-01-12 00:36:12
    200        | caisse2 | Payé     | 2024-01-12 00:36:12
    ce que j'ai essayé comme requette :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT  user,SUM(montant) as montant
    FROM
    (SELECT user,SUM(montant) AS montant FROM tb_spaiement WHERE statut = 'Payé' AND  DATE(moment) = CURDATE()
    UNION ALL
    SELECT user,SUM(montant) AS montant FROM tb_tpaiement WHERE statut = 'Payé' AND  DATE(moment)= CURDATE()) as montant ORDER by user

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

    Quelques remarques préalables

    • pourquoi y a -t-il deux tables qui semblent strictement identiques ?
    • certains noms de colonnes sont des mots réservés SQL (cas de "user"), ce qui impose d'encadrer ces noms par des délimiteurs
      Pour éviter ces contraintes inutiles, il faut éviter d'utiliser ce genre de noms.
      Dans mon exemple, j'ai préfixé les noms de colonnes par sp (début du nom de la table), ainsi pas de souci de cet ordre
    • le statut en toutes lettres qui plus est avec un accent comme 'payé' gagnerait en concision à être remplacé par un code ou un identifiant qui serait une clef étrangère vers une table des statut
    • le jeu d'essai fourni est trop pauvre : on n'a que la bonne date et que des "payés"), c'est pourquoi je l'ai enrichi dans mon exemple ci-dessous.


    Tout d'abord, création du jeu d'essai un peu plus riche au moyen d'une CTE :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    with tb_spaiement (sp_montant, sp_user, sp_statut, sp_moment) as
        (select 0500, 'admin',   'payé', '2024-01-12'   union all
         select 0120, 'admin',   'payé', '2024-01-13'   union all 
         select 0200, 'caisse1', 'payé', '2024-01-12'   union all
         select 0210, 'caisse2', 'truc', '2024-01-12'   union all
         select 0188, 'caisse2', 'payé', '2024-01-12'   union all
         select 0010, 'caisse2', 'payé', '2024-01-12'   union all
         select 0110, 'caisse3', 'payé', '2024-01-12'   union all   
         select 0300, 'caisse3', 'payé', '2024-01-13'   
        )


    Puis utilisation d'autres CTE pour créer le résultat :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       , tabx (col1, col2) as
        (select sp_user
              , cast(round(sum(sp_montant)) as char(10))
         from tb_spaiement
         where sp_statut = 'payé'
           and sp_moment = '2024-01-12'
         group by sp_user
        ) 
       , taby (coly) as
        (select concat(col1, ':', col2, '   ') 
         from tabx 
        )
    select group_concat(coly) as result_final
    from taby


    Résultat :

    Nom : Sans titre.png
Affichages : 50
Taille : 1,8 Ko


    Note : s'il y a un grand nombre de caisses, il faudra peut-être modifier le paramétrage de la longueur maxi du group_concat (voir manuel de référence MySQL)

  3. #3
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Il te manque un GROUP BY sur la requête englobante.

    Avec une CTE :

    with dataset as (
        select all user, montant from tb_spaiement where statut = 'Payé' and date(moment) = current_date
        union all 
        select all user, montant from tb_tpaiement where statut = 'Payé' and date(moment) = current_date
    )
    select all user, sum(montant) as montant
    from dataset
    group by user
    order by user asc;
    Si le nom de colonne user pose problème alors il faudra le délimiter avec ` ou mieux si tu es en mode strict / ANSI_QUOTES, avec "
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 910
    Points
    38 910
    Billets dans le blog
    9
    Par défaut
    Concernant les mots réservés, je préfère nettement ne pas les utiliser plutôt qu'utiliser des délimiteurs, c'est à la fois plus simple et plus clair

    Par contre, j'attends toujours les explications au sujets des deux tables identiques, c'est très suspect quant à la qualité du modèles de données, et c'est susceptible de modifier la solution à appliquer.

    À suivre...

Discussions similaires

  1. Réponses: 13
    Dernier message: 18/06/2011, 14h01
  2. [Doctrine] requête pour calculer une somme
    Par flora806 dans le forum ORM
    Réponses: 26
    Dernier message: 23/03/2011, 11h38
  3. [AC-2003] Bloqué pour calculer la somme d'un champ entre 2 date
    Par bastien3117 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/08/2009, 13h08
  4. [Débutant] Petit problème pour calcul de somme
    Par kriskikout dans le forum Ada
    Réponses: 4
    Dernier message: 04/11/2006, 06h47

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