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êtes récupérant les valeurs toutes les semaines et tous les mois


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 97
    Points : 51
    Points
    51
    Par défaut Requêtes récupérant les valeurs toutes les semaines et tous les mois
    slt à tous,svp j'ai une BD 'charges' où les différents type de charges sont introduites chaque semaine,la BD est structurée comme ci dessous par exemple :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE `charges` (
      `id` int(4) NOT NULL auto_increment,
      `type` varchar(50) NOT NULL default '',
      `montant` double NOT NULL default '0',
      `agence` varchar(15) NOT NULL default '',
      `date` datetime NOT NULL default '0000-00-00 00:00:00',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INSERT INTO `charges` VALUES (1, 'BI', 1035877, 'douala', '2008-06-02 01:10:42');
    INSERT INTO `charges` VALUES (2, 'ME', 363730, 'douala', '2004-11-01 01:10:53');
    INSERT INTO `charges` VALUES (3, 'REB', 70000, 'douala', '2004-11-01 01:11:03');
    INSERT INTO `charges` VALUES (4, 'RT', 100000, 'douala', '2004-11-01 01:11:10');
    INSERT INTO `charges` VALUES (5, 'FG', 4759670, 'douala', '2004-11-01 01:11:22');
    INSERT INTO `charges` VALUES (6, 'IT', 9990651, 'douala', '2004-11-01 01:11:35');
    INSERT INTO `charges` VALUES (7, 'BI', 70000, 'douala', '2008-06-09 00:00:00');
    INSERT INTO `charges` VALUES (8, 'BI', 120000, 'douala', '2008-06-16 00:00:00');
    INSERT INTO `charges` VALUES (9, 'BI', 50000, 'douala', '2008-06-23 00:00:00');
    INSERT INTO `charges` VALUES (10, 'BI', 150000, 'douala', '2008-06-30 00:00:00');
    INSERT INTO `charges` VALUES (11, 'BI', 90000, 'yaounde', '2008-07-03 00:00:00');
    1 - j'aimerais récupérer le montant correspondant à un type de charge (BI pour la BD ci dessus) chaque semaine que je mettrais dans une variable pour faire d'autres calculs.

    2 - j'aimerais ensuite dans une autre requêtte faire la somme des montants d'un type de charge (BI pour la BD ci dessus) au bout d'un mois que je mettrais dans une autre variable pour faire d'autres calculs.

    pour la première requêtte je propose ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $sql = 'SELECT id,montant, '
            . ' type FROM `elements` '
            . ' WHERE id = ( '
            . ' SELECT max( id ) '
            . ' FROM elements'
            . ' WHERE type = ''CA'' and agence=''douala'') ';
    $result = mysql_query($sql) or die('Erreur Sql !'.$sql.'<br>'.mysql_error());
    $row = mysql_fetch_array($result);
    $montant = $row[1];
    qu'en penser vous ?

    pour la deuxième requêtte j'ai aucune idée aider moi, je compte bien sur vous tous y compris les modérateurs qui on plus d'expérience et de volonté, à bientôt

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Pour un type donné, il n'y a qu'une seule ligne maximum par semaine ?
    Si oui, pour la première requête, avec le mot clef LIMIT, ça évite de passer par une sous-requête, plus gourmande en performances et qui n'est pas utile si le type est spécifié en dur dans la clause WHERE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT id, montant, type 
    FROM `elements` 
    WHERE type = 'CA' 
    and agence = 'douala'
    ORDER BY `date` DESC
    LIMIT 0,1;
    Attention, il n'est pas recommandé d'utiliser le mot réservé DATE pour nommer un champ de la base.

    Pour la deuxième requête, il faut faire une somme groupée par MONTH(`date`).
    Voilà le lien vers un très bon tutoriel de SQL .

    ced

  3. #3
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 97
    Points : 51
    Points
    51
    Par défaut
    oui ced, merci pour la balise code et tes contributions je pense que ça m'éclairci et merci pour le lien, je vais faire les requêttes tel que tu me l'a indiquer et je te tiendrais informé dès que je suis entièrement satisfait, à bientôt

  4. #4
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 97
    Points : 51
    Points
    51
    Par défaut
    ced, j'ajoute à ta remarque de tout à l'heure qu'il n'est pas aussi recommander d'utiliser le mot réservé type que j'ai utiliser pour nomer mon champs tout coe date donc j'ai remplacer ces mots respectivement par type_charge et date_insert.

    en somme j'ai trouver les deux requêttes à savoir :

    1 -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT id, montant, type_charge 
    FROM `elements` 
    WHERE type_charge = 'CA' 
    AND agence = 'douala'
    ORDER BY `date_insert` DESC
    LIMIT 0,1;
    // pour le cas où les infos sont insérées une fois par semaine

    2 -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT date_insert, type_charge, sum( montant ) , agence
    FROM `charges` 
    WHERE agence = 'douala'
    AND type_charges = 'BI'
    GROUP BY month( date_insert ) DESC
    LIMIT 0,1;
    ced, au cas où les infos sont entrées plusieurs fois par semaine comment devrais-je proceder ?

    merci encore pour ton aide

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Ouh là, pour la somme et le GROUP BY, c'est pas encore ça .
    Bon, en fait, il faut que les colonnes qui sont dans le SELECT et qui ne sont pas dans le SUM se retrouvent dans le GROUP BY...
    Je me suis aussi rendu compte qu'il faut grouper par mois et par année (parce que sinon, au bout d'un an, ça va sommer sur le même mois, mais de 2 années ).
    Donc, si ce que tu souhaites est bien le montant total par mois (notamment si il y a des entrées plusieurs fois par semaine), ça devrait être quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT YEAR(date_insert) AS annee, MONTH(date_insert) AS mois, type_charge, agence, sum( montant ) AS total
    FROM `charges` 
    WHERE agence = 'douala'
    AND type_charges = 'BI'
    GROUP BY YEAR(date_insert), MONTH(date_insert), type_charge, agence
    ORDER BY YEAR(date_insert) DESC, MONTH(date_insert) DESC
    Le mot-clef AS permet de donner un alias à une colonne renvoyée par une requête (parce que quand la colonne est dans une fonction, comme SUM, YEAR... elle perd son nom une fois renvoyée par la requête).

    ced

  6. #6
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 97
    Points : 51
    Points
    51
    Par défaut merci ced pour ta disponibilité et ta volonté, que DIEU te bénissee
    je m'excuse pour l'abscence, en fait je pensais recevoir ta reponse finale par mail, mais j'ai dû oublier de le spécifier lorsque j'envoyais le message. Bon je vais essayer ta dernière requette et me débrouiller au cas où ça ne marcherais pas.Merci, longue vie à toute l'équipe de developpez.com et à plus !

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 19/10/2011, 19h03
  2. Réponses: 3
    Dernier message: 10/06/2011, 10h51
  3. additionner les valeurs toutes les 4 lignes
    Par Wafa_o dans le forum Langage
    Réponses: 2
    Dernier message: 29/12/2009, 16h13
  4. Réponses: 9
    Dernier message: 01/02/2007, 11h36
  5. comment afficher les valeurs d'une semaine
    Par duck54 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/05/2006, 22h57

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