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

Requête pour comparer 11 jours avec l'année précédente [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 19-02-2012 à 12:29:52    

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
Reply

Marsh Posté le 19-02-2012 à 12:29:52   

Reply

Marsh Posté le 20-02-2012 à 08:49:05    

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).

Reply

Marsh Posté le 20-02-2012 à 08:51:12    

Ok merci je vais tester cela

Reply

Marsh Posté le 20-02-2012 à 09:35:08    

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.
Reply

Marsh Posté le 22-02-2012 à 22:58:00    

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'

Reply

Marsh Posté le 22-02-2012 à 23:00:16    

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


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

Marsh Posté le 22-02-2012 à 23:04:25    

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

Reply

Marsh Posté le 22-02-2012 à 23:12:53    

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.
Reply

Marsh Posté le 22-02-2012 à 23:18:01    

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)

Reply

Marsh Posté le 22-02-2012 à 23:36:05    

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.
Reply

Marsh Posté le 22-02-2012 à 23:36:05   

Reply

Marsh Posté le 22-02-2012 à 23:38:34    

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'

Reply

Marsh Posté le 23-02-2012 à 09:17:22    

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
Reply

Marsh Posté le 23-02-2012 à 09:53:30    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed