Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2268 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Requête pour comparer 11 jours avec l'année précédente

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[MySQL] Requête pour comparer 11 jours avec l'année précédente

n°2127111
Sethenssen
Posté le 19-02-2012 à 12:29:52  profilanswer
 

Bonjour,
 
J'ai une requête ci-dessous qui me donne le nombre de conso payante/gratuite sur les 11 derniers jours en partant de la date du jour.
 

Code :
  1. SELECT DATE_FORMAT(billing_date, '%d/%m/%Y') AS JOUR,
  2.       SUM(IF(price>0, 1, 0)) AS PAYANT,
  3.       SUM(IF(price=0, 1, 0)) AS GRATUIT
  4. FROM rfo_billing
  5. WHERE billing_date>=current_date() - INTERVAL 11 DAY
  6. GROUP BY DATE_FORMAT(billing_date, '%Y%m%d')
  7. ORDER BY DATE_FORMAT(billing_date, '%Y%m%d') DESC;


 
Ce que je recherche est d'afficher dans une seule requête la comparaison avec l'année dernière
 

Code :
  1. JOUR       PAYANT    GRATUIT    ANNE -1    PAYANT    GRATUIT
  2. 18/02/2012    5642      541    18/02/2011    8987    5465
  3. 17/02/2012    1235       25    17/02/2011    9754    6452
  4. 16/02/2012    753       110    16/02/2011    4889    6500
  5. 15/02/2012    48769    4102    15/02/2011    4654    5410
  6. 14/02/2012    4564     5101    14/02/2011    8466    6546
  7. 13/02/2012    1546       98    13/02/2011    9003    4468
  8. 12/02/2012    4548      123    12/02/2011    9787    15328
  9. 11/02/2012    213        12    11/02/2011    9877    4564
  10. 10/02/2012    2984     4511    10/02/2011    1546    541
  11. 09/02/2012    12135    2156    09/02/2011    45658    6121
  12. 08/02/2012    6468     3544    08/02/2011    5400    455


 
J'ai essayé avec plusieurs imbrications d'union mais à chaque fois cela se résulte en erreur.
Si quelqu'un pouvait m'aider cela serait super sympas.
 
Merci d'avance.


Message édité par Sethenssen le 19-02-2012 à 12:30:36
mood
Publicité
Posté le 19-02-2012 à 12:29:52  profilanswer
 

n°2127199
Oliiii
Posté le 20-02-2012 à 08:49:05  profilanswer
 

Tu devrais y arriver en enlevant l'année de ton group by et ajouter dans ton where année = 2012 ou 2011 (voir meme d'autres années si tu veux etendre la comparaison).

n°2127200
Sethenssen
Posté le 20-02-2012 à 08:51:12  profilanswer
 

Ok merci je vais tester cela

n°2127203
mrbebert
Posté le 20-02-2012 à 09:35:08  profilanswer
 

En faisant ta requête pour cette année et un LEFT JOIN sur la même requête et en réunissant les lignes décalées d'une année [:figti]  
 
Quelque chose dans ce genre :
 

Code :
  1. SELECT DATE_FORMAT(billing_date, '%d/%m/%Y') AS JOUR
  2.      , SUM(IF(price>0, 1, 0))   AS PAYANT
  3.      , SUM(IF(price=0, 1, 0))   AS GRATUIT
  4.      , IFNULL(PAYANT_old, 0))   AS PAYANT_old
  5.      , IFNULL(GRATUIT_old, 0))  AS GRATUIT_old
  6. FROM rfo_billing
  7. LEFT JOIN (
  8.   SELECT billing_date           AS billing_date_old
  9.        , SUM(IF(price>0, 1, 0)) AS PAYANT_old
  10.        , SUM(IF(price=0, 1, 0)) AS GRATUIT_old
  11.   GROUP BY billing_date
  12. ) tb_previous_year ON tb_previous_year.billing_date=(rfo_billing.billing_date - INTERVAL 1 YEAR)
  13. WHERE (billing_date <  current_date() + INTERVAL  1 DAY)
  14.   AND (billing_date >= current_date() - INTERVAL 11 DAY)
  15. GROUP BY billing_date;


Message édité par mrbebert le 20-02-2012 à 09:41:45

---------------
Doucement le matin, pas trop vite le soir.
n°2127875
Sethenssen
Posté le 22-02-2012 à 22:58:00  profilanswer
 

Bonsoir mrbebert,
Je viens de tester ta requête il y avait 2 petites parenthèses en trop dans le select, mais après la requête est tombé en erreur à cause du group by
 
line 11, col 3: Incorrect syntax near 'GROUP'

n°2127876
mrbebert
Posté le 22-02-2012 à 23:00:16  profilanswer
 

Oui, il manque le "FROM" dans la sous-requête :o


---------------
Doucement le matin, pas trop vite le soir.
n°2127877
Sethenssen
Posté le 22-02-2012 à 23:04:25  profilanswer
 

Forcément c'est plus évident et logique comme ça :)
Merci, la requête est en train de tourner je te dis ça

n°2127878
mrbebert
Posté le 22-02-2012 à 23:12:53  profilanswer
 

Si c'est trop long, il y a peut être une optimisation à faire en filtrant les lignes de la sous-requête [:figti]  
Pas la peine qu'il traite toute la table alors qu'on sait qu'il n'y a que 11 jours qui nous intéressent.


---------------
Doucement le matin, pas trop vite le soir.
n°2127879
Sethenssen
Posté le 22-02-2012 à 23:18:01  profilanswer
 

Oui cela fait 14min qu'elle tourne  :sweat:  
 
Tu penses à utiliser la même clause where dans la sous requête avec le left join en ajoutant quelque chose du style ?
 

Code :
  1. (billing_date <  current_date() + INTERVAL  1 DAY)
  2.   AND (billing_date >= current_date() - INTERVAL 11 DAY)

n°2127887
mrbebert
Posté le 22-02-2012 à 23:36:05  profilanswer
 

Oui, la même clause WHERE, mais décalée d'1 an.
On fait une jointure entre des lignes et les mêmes lignes 1 an plus tôt.


---------------
Doucement le matin, pas trop vite le soir.
mood
Publicité
Posté le 22-02-2012 à 23:36:05  profilanswer
 

n°2127888
Sethenssen
Posté le 22-02-2012 à 23:38:34  profilanswer
 

Ok,
Erf après 32min la requête vient de fail avec comme erreur
 
Lookup Error - MySQL Database Error: Unknown column 'tb_previous_year.billing_date' in 'on clause'

n°2127900
rufo
Pas me confondre avec Lycos!
Posté le 23-02-2012 à 09:17:22  profilanswer
 

Ligne 12, j'aurais mis :
) AS tb_previous_year ON b_previous_year.billing_date=(rfo_billing.billing_date - INTERVAL 1 YEAR)


Message édité par rufo le 23-02-2012 à 09:17:39

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2127907
mrbebert
Posté le 23-02-2012 à 09:53:30  profilanswer
 

Je crois que les 2 syntaxes sont acceptées :)

Sethenssen a écrit :

Ok,
Erf après 32min la requête vient de fail avec comme erreur
 
Lookup Error - MySQL Database Error: Unknown column 'tb_previous_year.billing_date' in 'on clause'

Oui, j'ai renommé la colonne en "billing_date_old" dans la sous-requête. Du coup, il faut que ca corresponde dans la condition de la jointure :
ON tb_previous_year.billing_date_old=(rfo_billing.billing_date - INTERVAL 1 YEAR)
 
C'est dur de faire MySQL sans MySQL sous la main :(


Message édité par mrbebert le 23-02-2012 à 09:54:02

---------------
Doucement le matin, pas trop vite le soir.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [MySQL] Requête pour comparer 11 jours avec l'année précédente

 

Sujets relatifs
[SQL] Optimisation de requête sqlmeilleur façon d'écrire une requête sql
Requête PL/SQL[MySQL] Besoin d'aide pour une requete UPDATE
[MySQL] Mise à jour d'une colonne d'une table.[MySQL] Problème d'exécution d'une requête SQL
Perl: afficher le résultat d'une requête sqlPerformances Curseur / Complexité requête SQL
Plus de sujets relatifs à : [MySQL] Requête pour comparer 11 jours avec l'année précédente


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR