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 :

Tri sur SUM avec ROLLUP [MySQL-5.1]


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Developpeur IT
    Inscrit en
    Avril 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developpeur IT
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Tri sur SUM avec ROLLUP
    Bonjour,

    Merci de votre indulgence, je ne suis pas un habitué des forums. En général, je trouve solution et je ne pose pas les questions.

    J'ai une base avec les informations suivantes : groupe_client ; marque_article ; date_achat ; montant_achat

    Je souhaite sortir un tableau comme ceci :

    groupe 1 ; marque 1 ; montant_achat_2011=1000 ; montant_achat_2012=1200
    groupe 1 ; marque 3 ; montant_achat_2011=2000 ; montant_achat_2012=1000
    groupe 2 ; marque 1 ; montant_achat_2011=1500 ; montant_achat_2012=1600
    groupe 2 ; marque 3 ; montant_achat_2011=5000 ; montant_achat_2012=1400
    groupe 2 ; marque 2 ; montant_achat_2011=2500 ; montant_achat_2012=1200

    J'ai fait un rollup sur groupe et marque avec mes sums... mon problème est le tri sur montant_achat_2012

    Merci de votre aide.

    Je donne le code que j'ai pondu... en tant que débutant... je le donne entier sans éliminer le code non nécessaire... pour ne pas enlever un truc qui choque l'expert...
    Pour les experts... merci... ce sont mes premiers codes... je souhaite faire du reporting.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    select
         ifnull(A_marque,'Marque') as 'Marque',
         ifnull(L_nom_groupement,'Groupement') as 'Groupement',
         ifnull(A_nom_laboratoire,'Laboratoire') as 'Laboratoire',
         EXTRACT(YEAR FROM (DATE_SUB(DATE_FORMAT(curdate(),'%Y-%m-%d'), INTERVAL 2 year))) as 'annee_moins_2',
         DATE_FORMAT(((DATE_SUB(DATE_FORMAT(curdate(),'%Y-%m-%d'), INTERVAL 1 month))), '%Y') as 'annee_courant',
         DATE_FORMAT(((DATE_SUB(DATE_FORMAT(curdate(),'%Y-%m-%d'), INTERVAL 1 month))), '%b') as 'mois_cumul',
         EXTRACT(YEAR FROM (DATE_SUB(DATE_FORMAT(curdate(),'%Y-%m-%d'), INTERVAL 1 year))) as 'annee_moins_1',
         sums.ansmoins2,
         sums.ansmoins1,
         sums.ansmoins1cumul,
         sums.anscumul,
         round(100 / sums.ansmoins2 *  sums.ansmoins1,2) as Pourcents_ans,
         round(100 / sums.ansmoins1cumul *  sums.anscumul,2) as Pourcents_ans_cumul
      from
         (
         select
          L_no_client,
          L_nom,
          L_ville,
          A_no,
          A_nom,
          A_marque,
          L_nom_groupement,
          A_nom_laboratoire,
          sum(
             if(
                (statn.`D_facture` >=  DATE_SUB(DATE_FORMAT(curdate(),'%Y-01-01'), INTERVAL 2 year)
                and
                statn.`D_facture` <=
                  DATE_SUB(DATE_FORMAT(curdate(),'%Y-12-31'), INTERVAL 2 year)),A_montant,0)) as 'ansmoins2',
          sum(
             if(
                (statn.`D_facture` >=
                  DATE_SUB(DATE_FORMAT(curdate(),'%Y-01-01'), INTERVAL 1 year)
                and
                statn.`D_facture` <=
                  DATE_SUB(DATE_FORMAT(curdate(),'%Y-12-31'), INTERVAL 1 year)),A_montant,0)) as 'ansmoins1',
          sum(
             if(
                (statn.`D_facture` >=
                  DATE_SUB(DATE_FORMAT(curdate(),'%Y-01-01'), INTERVAL 1 year)
                and
                statn.`D_facture` <=
                  DATE_SUB(DATE_FORMAT(curdate(),'%Y-%m-%d'), INTERVAL 1 year)),A_montant,0)) as 'ansmoins1cumul',
          sum(
             if(
                statn.`D_facture` >= DATE_FORMAT(curdate(),'%Y-01-01')
               and
                statn.`D_facture` <= DATE_FORMAT(curdate(),'%Y-12-31'),A_montant,0)) as 'anscumul'
     
         from statn
         group by A_marque,L_nom_groupement with rollup)
         as sums;

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

    Quelque chose comme ceci :

    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
     
    SELECT 
        groupe_client
      ,marque_article
      , SUM(
          CASE WHEN YEAR(date_achat) = YEAR(current_date()) - 2 
            THEN montant_achat
            ELSE 0
          END
        ) AS MontantAnMoins2
      , SUM(
          CASE WHEN YEAR(date_achat) = YEAR(current_date()) - 1 
            THEN montant_achat
            ELSE 0
          END
        ) AS MontantAnMoins1
    FROM statn
    WHERE date_achat >= '0000-01-01' + INTERVAL YEAR(CURRENT_DATE()) -2 YEAR
    GROUP BY 
       groupe_client
      ,marque_article

  3. #3
    Candidat au Club
    Homme Profil pro
    Developpeur IT
    Inscrit en
    Avril 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developpeur IT
    Secteur : Distribution

    Informations forums :
    Inscription : Avril 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Ne pas utiliser rollup pour ce cas... en effet
    Bonjour,

    Merci pour la réponse... c'est bien cela...

    Le code ci-dessous sort donc une liste assez complète.
    Elle comporte le groupe client, les marques vendues à celui-ci triées par les meilleurs ventes de l'année en cours.
    Il y a en plus les ventes de l'année -2, les ventes de l'année -1, les ventes de l'année -1 de janvier à la fin du mois précédent, les ventes de l'année courante pour la fin du mois précédent, le rapport en % entre ces deux périodes comparées... ouf...

    Détail ci-dessous pour comparatif sur la même période pour l'année précédente.. moins un an pour la fin du même mois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum(if(D_facture >= DATE_SUB(DATE_FORMAT(curdate(),'%Y-01-01'), INTERVAL 1 year) and D_facture <= LAST_DAY(DATE_SUB(LAST_DAY(DATE_SUB(curdate(), INTERVAL 1 year)), INTERVAL 1 month)),A_montant,0)) as cumulprecedent,
    Je donne aussi le code complet pour les débutant comme moi... c'est toujours intéressant d'avoir un 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
    SELECT
         ifnull(F_nom_groupement,'Groupement') as 'Groupement',
         ifnull(A_marque,'Marque') as 'Marque',
         EXTRACT(YEAR FROM (DATE_SUB(DATE_FORMAT(curdate(),'%Y-%m-%d'), INTERVAL 2 year))) as 'annee_moins_2',
         DATE_FORMAT(((DATE_SUB(DATE_FORMAT(curdate(),'%Y-%m-%d'), INTERVAL 1 month))), '%Y') as 'annee_courant',
         DATE_FORMAT(((DATE_SUB(DATE_FORMAT(curdate(),'%Y-%m-%d'), INTERVAL 1 month))), '%b') as 'mois_cumul',
         EXTRACT(YEAR FROM (DATE_SUB(DATE_FORMAT(curdate(),'%Y-%m-%d'), INTERVAL 1 year))) as 'annee_moins_1',
         statn.`F_nom_groupement` AS statn_F_nom_groupement,
         statn.`A_marque` AS statn_A_marque,
         statn.`D_facture` AS statn_D_facture,
         statn.`D_annee` AS statn_D_annee,
         statn.`D_mois` AS statn_D_mois,
         statn.`A_montant` AS statn_A_montant,
         round ( 100 / sum(if(D_facture >= DATE_SUB(DATE_FORMAT(curdate(),'%Y-01-01'), INTERVAL 1 year) and D_facture <= LAST_DAY(DATE_SUB(LAST_DAY(DATE_SUB(curdate(), INTERVAL 1 year)), INTERVAL 1 month)),A_montant,0)) * sum(if(D_facture >= DATE_FORMAT(curdate(),'%Y-01-01') and D_facture <= DATE_FORMAT(curdate(),'%Y-12-31'),A_montant,0)) ,2 ) as pourcentcumul,
         sum(if(D_facture >= DATE_SUB(DATE_FORMAT(curdate(),'%Y-01-01'), INTERVAL 2 year) and D_facture <= DATE_SUB(DATE_FORMAT(curdate(),'%Y-12-31'), INTERVAL 2 year),A_montant,0)) as full_moins_deux,
         sum(if(D_facture >= DATE_SUB(DATE_FORMAT(curdate(),'%Y-01-01'), INTERVAL 1 year) and D_facture <= DATE_SUB(DATE_FORMAT(curdate(),'%Y-12-31'), INTERVAL 1 year),A_montant,0)) as full_moins_un,
         sum(if(D_facture >= DATE_SUB(DATE_FORMAT(curdate(),'%Y-01-01'), INTERVAL 1 year) and D_facture <= LAST_DAY(DATE_SUB(LAST_DAY(DATE_SUB(curdate(), INTERVAL 1 year)), INTERVAL 1 month)),A_montant,0)) as cumulprecedent,
         sum(if(D_facture >= DATE_FORMAT(curdate(),'%Y-01-01') and D_facture <= (LAST_DAY(DATE_SUB(curdate(), INTERVAL 1 MONTH))),A_montant,0)) as cumulactuel
    FROM
         `statn` statn
    where statn.F_code_kod  = 'DI ' and statn.F_secteur_de_vente ='S.OTC'
    group by statn.F_nom_groupement, statn.A_marque
    ORDER BY
         statn.A_marque asc,
         cumulactuel desc,
         statn.F_nom_groupement ASC
    Merci encore aux visiteurs / répondeurs du site...

    Je regarde comment clore le sujet... mais laisse encore ouvert si question/remarque sur la solution ci-dessus...

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

Discussions similaires

  1. Tri sur département avec mon département en premier
    Par vince29 dans le forum Langage SQL
    Réponses: 18
    Dernier message: 29/06/2012, 15h06
  2. tri sur listbox avec critère de selectin listbox multiselection
    Par jijie dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/06/2012, 07h58
  3. Problème Tri sur date avec count
    Par ilalaina dans le forum Designer
    Réponses: 2
    Dernier message: 15/09/2009, 14h31
  4. [MySQL] Tri sur requête avec jointure
    Par renaud26 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/02/2009, 09h40
  5. Tri sur critère avec un bouton
    Par mooh91 dans le forum Access
    Réponses: 3
    Dernier message: 31/01/2007, 23h53

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