[RESOLU] Requête SQL avec traitement d'un champ date

Requête SQL avec traitement d'un champ date [RESOLU] - SQL/NoSQL - Programmation

Marsh Posté le 16-08-2010 à 11:22:51    

Bonjour à tous,  
je bloque sur une requête SQL Select, voici le contexte.
 
J'ai une table SQL "VENTES" qui liste mes ventes.
Pour chaque vente, j'ai un champ "date_vente" contenant un timestamp (choppé via la fonction time() de PHP), qui correspond au moment précis où fut passée la vente.
 
Ce que j'aimerais faire, c'est récupérer le nombre de ventes par jour distinct.
Exemple :  
combien de ventes je fais le JEUDI, sur la période des 6 derniers mois ?
ou  
combien de ventes je fais le SAMEDI, sur les 2 dernières semaines ?
 
Exemple de résultat (boucle) :  
- SAMEDI 14 Aout : 10 ventes
- SAMEDI 21 Aout : 11 ventes
- SAMEDI 28 Aout : 13 ventes  
 
Ça, clairement, je suis pas assez calé en SQL pour savoir faire.
Et le bonus : si en plus je pouvais récupérer la moyenne via la même requête, ce serait le bonheur (bien que je puisse calculer ça en PHP par la suite).
 
Voilà, quelqu'un sait-il faire ça ?
Dans tous les cas merci du temps que vous voudrez bien m'accorder.
 
a+
Baptiste


Message édité par Matisme le 16-08-2010 à 15:12:52
Reply

Marsh Posté le 16-08-2010 à 11:22:51   

Reply

Marsh Posté le 16-08-2010 à 12:43:28    

Tu dois d'abord trouver la fonction qui te permet d'avoir le numero absolu du jour (donc pas le jour depuis le debut de l'année mais depuis la date 0 du SGBD), tu fais un Group By la dessus.
Puis tu dois trouver la fonction qui te donnes le numero du jour de la semaine (Samedi sera probablement numero 7) et tu utilises ca dans ton Where.
 
Voila ce que ca donne en SQL Server:

Code :
  1. SELECT FLOOR(convert(float,backup_start_date)) 'DayNumber', CONVERT(datetime,FLOOR(convert(float,backup_start_date))) 'Date', COUNT(*) 'Count'
  2. FROM dbo.backupset
  3. WHERE DATEPART(dw,backup_start_date) = 7
  4. GROUP BY FLOOR(convert(float,backup_start_date))


 
Si tu veux ajouter la moyenne ca deviens un peut plus compliqué:

Code :
  1. SELECT FLOOR(convert(float,a.backup_start_date)) 'DayNumber', CONVERT(datetime,FLOOR(convert(float,a.backup_start_date))) 'Date', COUNT(*) 'count', b.avgCount
  2. FROM dbo.backupset a
  3.     JOIN (
  4.         SELECT DATEPART(dw,a.[date]) 'weekday', AVG(a.[count]) 'avgCount'
  5.         FROM (
  6.             SELECT CONVERT(datetime,FLOOR(convert(float,backup_start_date))) 'date', COUNT(*) 'count'
  7.             FROM dbo.backupset
  8.             GROUP BY FLOOR(convert(float,backup_start_date))
  9.             ) a
  10.         GROUP BY DATEPART(dw,a.[date])
  11.     ) b ON b.weekday = DATEPART(dw,a.backup_start_date)
  12. WHERE DATEPART(dw,a.backup_start_date) = 7
  13. GROUP BY FLOOR(convert(float,a.backup_start_date)), b.avgCount

Reply

Marsh Posté le 16-08-2010 à 14:06:59    

Salut Oliiii, merci pour ta réponse :)
Je dois pas avoir la moitié du quart de ton expérience, du coup j'ai un peu de mal à lire et à comprendre la logique de cet exemple.

 

- convert(float,backup_start_date) => à quoi correspond "backup_start_date" ? C'est le champ c'est ça ? Dans mon cas, "date_vente" ? => Pourquoi convertir "date_vente" en float ?
- 'DayNumber' c'est la variable dans laquelle je stocke (on appelle ça un alias je crois non ?) Il manque pas un AS à ce moment là ?
- Ensuite le CONVERT suivant, que fait-il ? Il retransforme en timestamp ?
- DATEPART(dw,backup_start_date) = 7 => ça correspond à Dimanche ça non ? Ou à samedi si on considère que la semaine débute le Dimanche ? Tu confirmes ? Donc en fonction du jour qui m'intéresse, je dois modifier la valeur (entre 1 pour dimanche, et 7 pour samedi) ?

 

Serait-ce abuser de te demander ce que ça donne avec le nom de ma table ("VENTES" ) et le champ "date_vente" ? Ca me rendrait la requête un peu plus lisible, je pourrais ainsi plus facilement en comprendre la logique.

 

En attendant, je me lance : ma requête (sans la moyenne), serait donc :

Code :
  1. SELECT FLOOR(convert(float,date_vente)) AS 'DayNumber', CONVERT(datetime,FLOOR(convert(float,date_vente))) AS 'Date', COUNT(*) AS 'Count'
  2. FROM "VENTES"
  3. WHERE DATEPART(dw,date_vente) = 7
  4. GROUP BY FLOOR(convert(float,date_vente))

?

 

J'ai essayé de la faire tourner dans phpMyAdmin, apparemment il y a un erreur de syntaxe.

Message cité 1 fois
Message édité par Matisme le 16-08-2010 à 14:31:50
Reply

Marsh Posté le 16-08-2010 à 14:57:15    

Bonjour,
 
Essaie ça :
 
SELECT SUM(nb_vente) as nb_vente, DATE_FORMAT(FROM_UNIXTIME(date_vente), '%Y-%m-%d') as date_vente
FROM vente
WHERE DATE_FORMAT(FROM_UNIXTIME(date_vente), '%w') = 6
GROUP BY date_vente
 
Ensuite, tu fais la mise en forme de la date  en PHP.

Reply

Marsh Posté le 16-08-2010 à 15:03:59    

Salut jeca, merci, ça fonctionne impeccable :) (sauf que c'est COUNT au lieu de SUM) :)
Je vais bidouiller pour compléter la requête, en attendant merci de m'avoir fourni cette base :)

 

Bonne journée !


Message édité par Matisme le 16-08-2010 à 15:45:19
Reply

Marsh Posté le 16-08-2010 à 16:21:11    

Matisme a écrit :

Salut Oliiii, merci pour ta réponse :)
Je dois pas avoir la moitié du quart de ton expérience, du coup j'ai un peu de mal à lire et à comprendre la logique de cet exemple.
 
- convert(float,backup_start_date) => à quoi correspond "backup_start_date" ? C'est le champ c'est ça ? Dans mon cas, "date_vente" ? => Pourquoi convertir "date_vente" en float ?


Convertir une date en float ca permet de la convertir en un numero: Maintenant = 40404,6566981481
40404 = jour (01/01/1900 + 40404 jours = 16/08/2010), 0.6566981481 = heures, minutes, secondes (15h45m38s).
 
FLOOR() permet d'arrondir vers le bas sans decimale, donc au final ca permet de n'avoir que le jour sans les heures, minutes, secondes.
 
Ca a l'air compliqué mais c'est extremement rapide (vue qu'une date est stockée en float en interne et un FLOOR n'est qu'une copie d'une zone memoire a une autre).

Matisme a écrit :


- 'DayNumber' c'est la variable dans laquelle je stocke (on appelle ça un alias je crois non ?) Il manque pas un AS à ce moment là ?

Le AS est facultatif, mais theoriquement il en faut un oui.

Matisme a écrit :


- Ensuite le CONVERT suivant, que fait-il ? Il retransforme en timestamp ?

Il retransforme en Date mais sans les heures, minutes, secondes.

Matisme a écrit :


- DATEPART(dw,backup_start_date) = 7 => ça correspond à Dimanche ça non ? Ou à samedi si on considère que la semaine débute le Dimanche ? Tu confirmes ? Donc en fonction du jour qui m'intéresse, je dois modifier la valeur (entre 1 pour dimanche, et 7 pour samedi) ?

C'est bien ca oui.

Matisme a écrit :


 
Serait-ce abuser de te demander ce que ça donne avec le nom de ma table ("VENTES" ) et le champ "date_vente" ? Ca me rendrait la requête un peu plus lisible, je pourrais ainsi plus facilement en comprendre la logique.
 
En attendant, je me lance : ma requête (sans la moyenne), serait donc :

Code :
  1. SELECT FLOOR(convert(float,date_vente)) AS 'DayNumber', CONVERT(datetime,FLOOR(convert(float,date_vente))) AS 'Date', COUNT(*) AS 'Count'
  2. FROM "VENTES"
  3. WHERE DATEPART(dw,date_vente) = 7
  4. GROUP BY FLOOR(convert(float,date_vente))

?
 
J'ai essayé de la faire tourner dans phpMyAdmin, apparemment il y a un erreur de syntaxe.


 
Je ne connais pas assez MySQL pour faire ce genre de query, donc j'ai fais l'equivalent en SQL Server pour te donner une idée.


Message édité par Oliiii le 16-08-2010 à 16:22:46
Reply

Marsh Posté le 16-08-2010 à 16:59:42    

Merci Oliii, c'est beaucoup plus clair à présent :)

Reply

Sujets relatifs:

Leave a Replay

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