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 :

Grouper commandes par jour / semaine


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Novembre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmarketer

    Informations forums :
    Inscription : Novembre 2015
    Messages : 22
    Points : 28
    Points
    28
    Par défaut Grouper commandes par jour / semaine
    Bonjour,

    j'ai une table commandes avec un champ "date_creation" et un champ "montant"

    Je cherche à sortir le nombre total et le montant total (somme des montants) de commandes par jour, par semaine, par mois.

    Une idée pour faire ça en SQL plutôt que par un script PHP ?

    Merci !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 811
    Points
    30 811
    Par défaut
    Son problème peut être facilement résolu avec les fonctions de regroupement : Groupage, ensembles et sous ensembles.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  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,

    Vous pouvez faire 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
     
    SELECT
    	 	WEEK(date_creation)	as semaine
    	, 	MONTH(date_creation)  	as mois
    	, 	DAY(date_creation)		as jour
    	,	COUNT(*) 			AS Nb
    	,	SUM(Montant) 			as montant
    FROM  documents
    GROUP BY 
    	 	MONTH(date_creation)  
    	, 	WEEK(date_creation)	
    	, 	DAY(date_creation)	
    WITH ROLLUP
    ;

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Webmarketer
    Inscrit en
    Novembre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmarketer

    Informations forums :
    Inscription : Novembre 2015
    Messages : 22
    Points : 28
    Points
    28
    Par défaut
    Merci c'est super !

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 384
    Points : 19 087
    Points
    19 087
    Par défaut
    Salut à tous.

    Citation Envoyé par zoocoral
    Merci c'est super !
    Et non, ce n'est pas super car la solution recommandée par "aieeeuuuuu" ne fonctionne pas !
    Je vais détailler ce qui ne fonctionne pas.

    1) en France, la semaine commence le lundi (1) et se termine le dimanche (7). Choisir la bonne périodicité est la solution.
    Pour résoudre ce problème, il faut pour cela utiliser la fonction "date_format()" afin de formater cette représentation de la périodicité.
    --> https://dev.mysql.com/doc/refman/5.5...on_date-format

    Quand une semaine est entière, elle commence à 1.
    De ce fait, la semaine qui est à cheval entre l'année précédente et la nouvelle année sera noté 53.
    Il suffit de lire un calendrier pour s'en rendre compte. Nous voyons que le paramètre à prendre est "%v".

    Inversement, la fonction "week()" commence le dimanche !

    2) la semaine 22 qui est a cheval sur deux mois (mai et juin) produit deux lignes et non une seule.

    3) le rollup, qui calcule la somme pour une période donnée, produit aussi la somme sur la totalité de la table.
    Elle n'a aucune signification particulière par rapport à la demande formulée par "zoocoral".
    Il vaut mieux l'utilise quand on a qu'une seule période.

    4) utiliser les fonctions "week()", "month()" et "day()" n'est pas ce qu'il y a de plus judicieux car on ne sait pas à quelle année elles se rapportent.
    Il vaut mieux utiliser la fonction "date_format()" en introduisant l'année en plus de la périodicité demandée.

    Pour la périodicité, on prend "%m" pour le mois sur deux chiffres et "%v" pour le numéro de la semaine.

    5) comme il y a deux cycles différents dans la périodicité de la semaine et du mois, on ne peut pas le faire en une seule fois.
    Il est donc nécessaire de faire un union entre chaque extraction.

    J'ai repris la solution proposée par "aieeeuuuuu" (première requête) et j'indique ma solution (deuxième requête), ou je tiens compte de ces particularités.
    La troisième requête montre la différence d'utilisation entre le format "%v" et la fonction "week()".
    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            default character set `latin1`
            default collate       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `commandes`
    --------------
     
    --------------
    CREATE TABLE `commandes`
    ( `id`             integer unsigned not null auto_increment primary key,
      `date_creation`  date             not null,
      `montant`        decimal(15,2)    not null
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
    --------------
     
    --------------
    insert into `commandes` (`date_creation`,`montant`) value
      ('2016-05-25', 125.04),
      ('2016-05-26',  66.22),
      ('2016-05-27',  75.17),
      ('2016-05-28', 325.32),
      ('2016-05-29', 415.26),
      ('2016-05-30',  17.34),
      ('2016-05-31', 125.04),
      ('2016-06-01',  66.22),
      ('2016-06-02',  75.17),
      ('2016-06-03', 325.32),
      ('2016-06-04', 415.26),
      ('2016-06-05',  17.34),
      ('2016-06-06', 125.04),
      ('2016-06-07',  66.22),
      ('2016-06-08',  75.17),
      ('2016-06-09', 325.32),
      ('2016-06-10', 415.26),
      ('2016-06-11',  17.34)
    --------------
     
    --------------
    select * from commandes
    --------------
     
    +----+---------------+---------+
    | id | date_creation | montant |
    +----+---------------+---------+
    |  1 | 2016-05-25    |  125.04 |
    |  2 | 2016-05-26    |   66.22 |
    |  3 | 2016-05-27    |   75.17 |
    |  4 | 2016-05-28    |  325.32 |
    |  5 | 2016-05-29    |  415.26 |
    |  6 | 2016-05-30    |   17.34 |
    |  7 | 2016-05-31    |  125.04 |
    |  8 | 2016-06-01    |   66.22 |
    |  9 | 2016-06-02    |   75.17 |
    | 10 | 2016-06-03    |  325.32 |
    | 11 | 2016-06-04    |  415.26 |
    | 12 | 2016-06-05    |   17.34 |
    | 13 | 2016-06-06    |  125.04 |
    | 14 | 2016-06-07    |   66.22 |
    | 15 | 2016-06-08    |   75.17 |
    | 16 | 2016-06-09    |  325.32 |
    | 17 | 2016-06-10    |  415.26 |
    | 18 | 2016-06-11    |   17.34 |
    +----+---------------+---------+
    --------------
    SELECT  WEEK(date_creation)     as semaine,
            MONTH(date_creation)    as mois,
            DAY(date_creation)      as jour,
            COUNT(*)                as nb,
            SUM(Montant)            as montant
    FROM  commandes
    GROUP BY MONTH(date_creation),
             WEEK(date_creation),
             DAY(date_creation)
    WITH ROLLUP
    --------------
     
    +---------+------+------+----+---------+
    | semaine | mois | jour | nb | montant |
    +---------+------+------+----+---------+
    |      21 |    5 |   25 |  1 |  125.04 |
    |      21 |    5 |   26 |  1 |   66.22 |
    |      21 |    5 |   27 |  1 |   75.17 |
    |      21 |    5 |   28 |  1 |  325.32 |
    |      21 |    5 | NULL |  4 |  591.75 |
    |      22 |    5 |   29 |  1 |  415.26 |
    |      22 |    5 |   30 |  1 |   17.34 |
    |      22 |    5 |   31 |  1 |  125.04 |
    |      22 |    5 | NULL |  3 |  557.64 |
    |    NULL |    5 | NULL |  7 | 1149.39 |
    |      22 |    6 |    1 |  1 |   66.22 |
    |      22 |    6 |    2 |  1 |   75.17 |
    |      22 |    6 |    3 |  1 |  325.32 |
    |      22 |    6 |    4 |  1 |  415.26 |
    |      22 |    6 | NULL |  4 |  881.97 |
    |      23 |    6 |    5 |  1 |   17.34 |
    |      23 |    6 |    6 |  1 |  125.04 |
    |      23 |    6 |    7 |  1 |   66.22 |
    |      23 |    6 |    8 |  1 |   75.17 |
    |      23 |    6 |    9 |  1 |  325.32 |
    |      23 |    6 |   10 |  1 |  415.26 |
    |      23 |    6 |   11 |  1 |   17.34 |
    |      23 |    6 | NULL |  7 | 1041.69 |
    |    NULL |    6 | NULL | 11 | 1923.66 |
    |    NULL | NULL | NULL | 18 | 3073.05 |
    +---------+------+------+----+---------+
    --------------
    select   'jour'                              as libelle,
             date_creation                       as periode,
             count(*)                            as nb,
             sum(montant)                        as montant
    from     commandes
    group by periode
     
    union
     
    select   'semaine'                           as libelle,
             date_format(date_creation, '%Y-%v') as periode,
             count(*)                            as nb,
             sum(montant)                        as montant
    from     commandes
    group by periode
     
    union
     
    select   'mois'                              as libelle,
             date_format(date_creation, '%Y-%m') as periode,
             count(*)                            as nb,
             sum(montant)                        as montant
    from     commandes
    group by periode
    --------------
     
    +---------+------------+----+---------+
    | libelle | periode    | nb | montant |
    +---------+------------+----+---------+
    | jour    | 2016-05-25 |  1 |  125.04 |
    | jour    | 2016-05-26 |  1 |   66.22 |
    | jour    | 2016-05-27 |  1 |   75.17 |
    | jour    | 2016-05-28 |  1 |  325.32 |
    | jour    | 2016-05-29 |  1 |  415.26 |
    | jour    | 2016-05-30 |  1 |   17.34 |
    | jour    | 2016-05-31 |  1 |  125.04 |
    | jour    | 2016-06-01 |  1 |   66.22 |
    | jour    | 2016-06-02 |  1 |   75.17 |
    | jour    | 2016-06-03 |  1 |  325.32 |
    | jour    | 2016-06-04 |  1 |  415.26 |
    | jour    | 2016-06-05 |  1 |   17.34 |
    | jour    | 2016-06-06 |  1 |  125.04 |
    | jour    | 2016-06-07 |  1 |   66.22 |
    | jour    | 2016-06-08 |  1 |   75.17 |
    | jour    | 2016-06-09 |  1 |  325.32 |
    | jour    | 2016-06-10 |  1 |  415.26 |
    | jour    | 2016-06-11 |  1 |   17.34 |
    | semaine | 2016-21    |  5 | 1007.01 |
    | semaine | 2016-22    |  7 | 1041.69 |
    | semaine | 2016-23    |  6 | 1024.35 |
    | mois    | 2016-05    |  7 | 1149.39 |
    | mois    | 2016-06    | 11 | 1923.66 |
    +---------+------------+----+---------+
    --------------
    select date_creation,
           date_format(date_creation, '%Y-%v') as periode,
           WEEK(date_creation)                 as semaine
    from commandes
    order by date_creation
    --------------
     
    +---------------+---------+---------+
    | date_creation | periode | semaine |
    +---------------+---------+---------+
    | 2016-05-25    | 2016-21 |      21 |
    | 2016-05-26    | 2016-21 |      21 |
    | 2016-05-27    | 2016-21 |      21 |
    | 2016-05-28    | 2016-21 |      21 |
    | 2016-05-29    | 2016-21 |      22 |
    | 2016-05-30    | 2016-22 |      22 |
    | 2016-05-31    | 2016-22 |      22 |
    | 2016-06-01    | 2016-22 |      22 |
    | 2016-06-02    | 2016-22 |      22 |
    | 2016-06-03    | 2016-22 |      22 |
    | 2016-06-04    | 2016-22 |      22 |
    | 2016-06-05    | 2016-22 |      23 |
    | 2016-06-06    | 2016-23 |      23 |
    | 2016-06-07    | 2016-23 |      23 |
    | 2016-06-08    | 2016-23 |      23 |
    | 2016-06-09    | 2016-23 |      23 |
    | 2016-06-10    | 2016-23 |      23 |
    | 2016-06-11    | 2016-23 |      23 |
    +---------------+---------+---------+
    --------------
    commit
    --------------
     
    --------------
    set autocommit = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    En ce qui concerne le mois, on retrouve les mêmes résultats :
    --> 2016-05 : 1149.39
    --> 2016-06 : 1923.66
    Le calcul est correcte.

    Par contre, nous avons deux problèmes avec le calcul appliqué sur la semaine.

    1) le calcul de "aieeeuuuuu" ne produit pas le même résultat que pour ma requête, pour la semaine 22.
    Car cette semaine est à cheval sur deux mois (mai et juin 2016).
    De ce fait, il y a deux lignes tandis que ma requête produit qu'une seule ligne.

    2) le calcul est faux dans la requête de "aieeeuuuuu".
    Mon total est de 1041.69 tandis que le total de "aieeeuuuuu" est : 557.64 + 881.97 ce qui donne 1439.61.
    C'est le même jeu d'essai, donc ce n'est pas lui qui est en cause.

    Pourquoi cette différence ?
    La semaine ne commence pas le même jour selon le format que l'on utilise.
    Il suffit de regarder la troisième requête pour le '2016-05-29' qui est un dimanche.
    Avec la fonction "week()", la semaine commence le dimanche, tandis qu'avec le format "%v", la semaine commence le lendemain, à savoir le lundi.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. [MySQL] Système de classement par jour/semaine/mois/all-time
    Par Kijer dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 02/02/2013, 13h32
  2. [ZF 1.10] Afficher les informations par jour, semaine et mois
    Par king_soft dans le forum Zend Framework
    Réponses: 1
    Dernier message: 27/12/2010, 12h45
  3. Afficher le nombre de commandes par jour ?
    Par fraginfo dans le forum Requêtes
    Réponses: 1
    Dernier message: 11/06/2009, 10h59
  4. compter le nombre de produit par jours, semaines et mois
    Par kindii dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/04/2009, 14h44
  5. Requête simple : nombre de commande par jour
    Par morgan4 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 19/12/2007, 16h43

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