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 :

Sélection des mois d'une année présents sur la BD et générer ceux qui manquent


Sujet :

Requêtes MySQL

  1. #1
    Membre éprouvé
    Avatar de ridan
    Inscrit en
    Avril 2003
    Messages
    710
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2003
    Messages : 710
    Points : 1 126
    Points
    1 126
    Par défaut Sélection des mois d'une année présents sur la BD et générer ceux qui manquent
    Salut à tous,

    Je dispose des deux tables suivantes :

    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
    CREATE TABLE 'sales_sheet' (
      `_id` int(11) NOT NULL auto_increment,
      `_typed_by` int(11) default NULL,
      `_product_id` int(11) default NULL,
      `_year` date default NULL,
      `_validation_state` int(11) default NULL,
      PRIMARY KEY  (`_oid`),
      KEY `_product_oid` (`_product_oid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
    CREATE TABLE 'sales_sheet_entries' (
      `_id` int(11) NOT NULL auto_increment,
      `_sheet_id` int(11) default NULL,
      `_month` date default NULL,
      `_quantity` int(11) default NULL,
      PRIMARY KEY  (`_oid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    Ces deux tables permettent de stocker des feuilles de ventes annuelles. La première table stocke la référence du produit, l'année et l'état de validation de la feuille. La seconde stocke les quantités mensuelles vendues pour une feuille.

    Ce que je souhaite avoir avoir comme résultat pour une année, la liste des mois pour lesquelles les quantités de vente auront déjà été saisies en plus des mois pour lesquelles le volume des ventes n'a pas été saisi (Le mois pouvant être présent ou pas dans la base de données). Par exemple :

    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
    -----------------------------------------
    | Mois			| Quantité	|
    -----------------------------------------
    | Janvier 2010		| (Vide)	|
    | Février 2010		| XXXXXX.XX	|
    | Mars 2010		| XXXXXX.XX	|
    | Avril 2010		| XXXXXX.XX	|
    | Mai 2010		| (Vide)	|
    | Juin 2010		| (Vide)	|
    | Juillet 2010		| (Vide)	|
    | Aout 2010		| (Vide)	|
    | Septembre 2010	| (Vide)	|
    | Octobre 2010		| XXXXXX.XX	|
    | Novembre 2010		| XXXXXX.XX	|
    | Décembre 2010		| (Vide)	|
    -----------------------------------------
    Les cases (Vide) peuvent correspondre à un mois déjà présent sur la base de données mais qui n'a pas de volume de ventes correspondant ou bien tout simplement non existant sur la base de données mais qu'il faut tout de même afficher.

    Une de mes contraintes c'est que je ne peux pas mettre directement 12 colonnes correspondant à la liste des mois dans la table sales_sheet car les spécifications du client sont changeantes et il se peut qu'il demande à ce que les ventes soient saisies par période sur une année et non pas par mois.

    J'espère avoir été assez clair.

    Merci d'avance pour votre aide.

    Cordialement,

  2. #2
    Membre éprouvé
    Avatar de ridan
    Inscrit en
    Avril 2003
    Messages
    710
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2003
    Messages : 710
    Points : 1 126
    Points
    1 126
    Par défaut
    Ok, résolu !!

    Voici la requête complète avec un jeu de données associé en pièce jointe (Les noms des tables ont changé par rapport au premier exemple) :

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    SELECT
    	COALESCE(sales._product_oid, (select _product_oid from _forecast_sales where _oid = 26)) as _product_oid,
    	dates.cMonth as _month,
    	COALESCE(sales._quantity, 0) as _quantity
    FROM
      (
    	SELECT
    		s._product_oid,
    		s._year,
    		spm._month,
    		spm._quantity as _quantity
    	FROM
    		_forecast_sales s
    	RIGHT JOIN
    		_forecast_sales_per_month spm
    	ON
    		spm._sheet_oid = s._oid
        AND
        s._oid = 26 /* Sheet oid */
    	) sales
    RIGHT JOIN
      (
      SELECT
        DATE_ADD(CONCAT_WS('-',(select YEAR(_year) from _forecast_sales where _oid = 26),'01','01'), INTERVAL n._oid - 1 MONTH) as cMonth
      FROM
      _numbers n
      ) dates
    ON
    	MONTH(sales._month) = MONTH(dates.cMonth)
    	AND
    	YEAR(sales._year) = YEAR(dates.cMonth)
    Si vous avez des questions, ou des améliorations à proposer n'hésitez pas !!

    Bye.
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. Requête tableau sur 12 mois d'une année, comment faire ?
    Par clickandgo dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 13/04/2012, 12h59
  2. Requête : Auto complétion des mois d'une année
    Par clickandgo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/06/2011, 11h57
  3. Affichage des mois dans une liste déroulante
    Par Le Rebel dans le forum Langage
    Réponses: 15
    Dernier message: 20/02/2006, 13h37
  4. [MySQL] Afficher des évènements selon une année précise
    Par gotenks dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 11/01/2006, 13h43
  5. Réponses: 6
    Dernier message: 30/11/2005, 15h15

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