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

 MySQL Discussion :

Requete : Années en lignes et mois en colonnes


Sujet :

MySQL

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut Requete : Années en lignes et mois en colonnes
    Bonjour,

    J'essaye de cumul des chiffres selon les années et les mois. Voici ma requête :

    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
     
    SELECT T1.DEP_0 as 'Département',
    year(T1.ACCDAT_0) as 'Année',
     
    (SELECT sum(T2.ACCDAT_0) FROM SINVOICE T2 
    WHERE T2.REP_0='xxx' 
    AND YEAR(T2.ACCDAT_0)=year(T1.ACCDAT_0)
    AND  month(T2.ACCDAT_0)=1
    AND T2.DEP_0=T1.DEP_0
    ) as 'Janvier',
    .
    .
    .
    (SELECT sum(T2.ACCDAT_0) FROM SINVOICE T2 
    WHERE T2.REP_0='xxx' 
    AND YEAR(T2.ACCDAT_0)=year(T1.ACCDAT_0)
    AND  month(T2.ACCDAT_0)=12
    AND T2.DEP_0=T1.DEP_0
    ) as 'Décembre'
     
    FROM SINVOICE T1
    WHERE T1.REP_0='xxx'
    AND (year(T1.ACCDAT_0) = 2011 OR year(T1.ACCDAT_0) = 2012)
    GROUP BY T1.DEP_0
    ORDER BY T1.DEP_0
    Cela me retourne des chiffres exorbitants qui ne me semblent pas corrects. Mon raisonnement est il bon ?

    De plus, dans certains cas la valeur null est retournée, comment faire en sorte d'avoir 0 (zéro) au lieu de null.

    Aussi, je veux avoir les sommes uniquement pour les années 2011 et 2012 et j'ai un gros doute sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND (year(T1.ACCDAT_0) = 2011 OR year(T1.ACCDAT_0) = 2012)
    Qu'en dites-vous ?

    Merci

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut
    Alias corrigé mais tjrs pareille ...

  3. #3
    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,


    Il me semble que vous pouvez tout simplement faire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
        DEP_0 AS 'Département',
        year(ACCDAT_0) AS 'Année',
        SUM(CASE WHEN month(ACCDAT_0) = 1 THEN ACCDAT_0 ELSE 0 END) AS Janvier,
        ...
        SUM(CASE WHEN  month(ACCDAT_0) = 12 THEN ACCDAT_0 ELSE 0 END) AS Decembre
    FROM SINVOICE
    WHERE REP_0='xxx'
    AND (year(T1.ACCDAT_0) = 2011 OR year(T1.ACCDAT_0) = 2012)
    GROUP BY DEP_0, year(ACCDAT_0)
    ORDER BY DEP_0
    Cela dit heu... vous faites la somme de la colonne ACCDAT, sum(T2.ACCDAT_0) qui semble contenir une date... vos chiffres exorbitants viennent peut être de là...

    Par ailleurs, votre GROUP BY ne porte pas sur toutes les colonnes ne faisant pas partie d'une fonction d'agregation... ça réserve aussi de mauvaises surprises avec MySQL

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut
    Oui, ou avais je la tete, sum(AMTNOT_0) et non sum(ACCDAT_0)


    La requete est bien plus rapide et me retourne les bon résultat ! merci ...

  5. #5
    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
    En effet, avec MySQL, si on additionne le 12 janvier 2013 au 25 juin 2013, cela ne le dérange absolument pas, et il nous indique clairement que nous obtenons... 40260737000000 !!!!!!!
    ça doit sans doute correspondre au 37 juillet 4026...

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut
    Ce sont bien les ordres de valeurs que j'avais

    Sinon pour en revenir au sujet, je dois faire une requête destinée à une autre datasource (autre requete).
    J'ai une table ou j'ai les ligne de facture avec le vendeur, date, montant de la facture,etc ... et une autre table vendeur où je peux retrouver des renseignements sur les objectif en l’occurrence l'objectif annuelle :

    Ce que je veut obtenir c'est requête (pour une datasource qui servira à un graphique) qui nous retourne 3 Colonnes :
    1 la liste des mois (pb : n'affiche pas toute la liste si aucune vente le moi courant)
    2 le cumul de son chiffre par rapport aux mois (ça c'est ok)
    3 le cumul MENSUELLE par rapport aux mois (pb : ça je ne sais pas comment faire)

    2 choses :
    - Comment faire pour obtenir un cumul de l'objectif sachant que dans la base de donnée on a uniquement un objectif annuelle (soit objectif mensuelle : OBJECTIF_0/12)
    - Pour certain mois aucune vente n'est réalisé ... comment faire pour les faire apparaître dans même avec la valeur 0

    Merci de vos aides ...

  7. #7
    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
    Il faut implémenter des tables de calendrier : http://sqlpro.developpez.com/cours/gestiontemps/#L3

    Vous pourrez ensuite faire une jointure externe avoir d'avoir les mois manquants dans vos données.


    Qu'appelez vous cumul mensuel par rapport aux mois ? un petit jeu de données + résultat attendu aiderai a comprendre...

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut
    J'ai deja une table de calendrier ...

    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
     
    CREATE TABLE IF NOT EXISTS `dates` (
      `date_id` bigint(20) NOT NULL,
      `date` date NOT NULL,
      `timestamp` bigint(20) NOT NULL,
      `weekend` char(10) NOT NULL DEFAULT 'Weekday',
      `day_of_week` char(10) NOT NULL,
      `month` char(10) NOT NULL,
      `month_day` int(11) NOT NULL,
      `year` int(11) NOT NULL,
      `week_starting_monday` char(2) NOT NULL,
      PRIMARY KEY (`date_id`),
      UNIQUE KEY `date` (`date`),
      KEY `year_week` (`year`,`week_starting_monday`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    Table des factures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TABLE IF NOT EXISTS `SINVOICE` (
      `NUM_0` char(15) NOT NULL,
      `BPR_0` char(10) NOT NULL,
      `POSCOD_0` varchar(10) DEFAULT NULL,
      `ACCDAT_0` datetime DEFAULT NULL,
      `SIVTYP_0` varchar(3) DEFAULT NULL,
    ...
      `CRY_0` varchar(3) DEFAULT NULL,
      `REP_0` char(10) DEFAULT NULL,
      `DEP_0` char(3) DEFAULT NULL,
      `AMTNOT_0` decimal(10,2) DEFAULT NULL,
      PRIMARY KEY (`NUM_0`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    avec :

    `NUM_0` numéro de facture
    `BPR_0` Client
    `POSCOD_0` Code Postal
    `ACCDAT_0` Date facture
    `CRY_0` Pays
    `REP_0` Code vendeur
    `DEP_0` Département
    `AMTNOT_0` Montant de la facture

    Une table vendeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE IF NOT EXISTS `SALESREP` (
      `REPNUM_0` char(10) NOT NULL,
    ...
      `OBJECTIF_0` decimal(10,2) DEFAULT NULL,
      PRIMARY KEY (`REPNUM_0`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    Avec :
    REPNUM : code vendeur
    OBJECTIF : chiffre d'affaire ANNUEL à réaliser

    Par Exemple pour un VENDEUR X ayant 2400 pour objectif ANNUEL soit 200 pour objectif MENSUEL, je veux avoir :

    MOIS | Chiffre cumulé | Objectif cumulé
    1 | 100 | 200
    2 | 340 | 400
    3 | 530 | 600
    4 | 700 | 800
    5 | 1100 | 1000
    6 | 1400 | 1200
    7 | 1700 | 1400
    8 | 1700 | 1600
    9 | 1900 | 1800
    10 | 1940 | 2000
    11 | 2000 | 2200
    12 | 2190 | 2400

    Le chiffre d'affaire cumulé est aléatoire
    Chaque mois nous devant ajouter un douzieme du chiffre pour l'objectif cumulé soit :
    ObjCumulé = ObjCumulé+(ObjAnnuel/12) pour chaque mois ...

    En espérant avoir été clair....

  9. #9
    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
    ObjCumulé = ObjCumulé+(ObjAnnuel/12) pour chaque mois
    ou (beaucoup) plus simplement :

    ObjCumulé = NumeroDeMois X ObjAnnuel / 12


  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2009
    Messages : 311
    Points : 127
    Points
    127
    Par défaut
    Excelente remarque ... voici ma requete :

    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
    SELECT month(t1.ACCDAT_0) as 'Mois', 
    (
       SELECT sum(t2.AMTNOT_0) as 'Chiffre Cumulé'
       FROM SINVOICE t2
       WHERE month(t2.ACCDAT_0) <= month(t1.ACCDAT_0)
       AND REP_0 = ${rep}
    ) AS Chiffre,
    (
     SELECT t3.OBJECTIF_0*month(t1.ACCDAT_0)/12
     FROM SALESREP t3
    WHERE t3.REPNUM_0=${rep}
    ) AS Objectif
     
    FROM SINVOICE t1
    WHERE REP_0 = ${rep}
    GROUP BY month(t1.ACCDAT_0), Chiffre
    ORDER BY month(t1.ACCDAT_0)
    Seulement, toujours mon problème avec les mois où aucune vente n'a eu lieu donc aucun résultat...

    De quel manière intégrer ma table "date" à cette requête ?

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

Discussions similaires

  1. [AC-2007] probleme de requete sql transposer ligne et colonne
    Par nicogef dans le forum Access
    Réponses: 1
    Dernier message: 16/06/2015, 19h38
  2. [AC-2003] Champs Mois en colonne ou en ligne?
    Par buzz73 dans le forum Modélisation
    Réponses: 6
    Dernier message: 26/08/2009, 17h16
  3. Listview selection d'une ligne et d'une colonne
    Par PierreBord dans le forum Composants VCL
    Réponses: 1
    Dernier message: 13/02/2006, 13h56
  4. requete pour compter les valeurs ds une colonne
    Par smariteau dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/02/2006, 17h37
  5. [SQL - ORACLE] Requete un peu compliquée (pour moi)
    Par Worldofdada dans le forum Langage SQL
    Réponses: 15
    Dernier message: 03/11/2005, 08h25

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