Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/05/2011, 15h21   #1
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Par défaut AVG et group by WEEK

Bonjour à tous,

Soit une table dont chaque ligne est composée d'un id(clé primaire), id_produit, quantite et date (format datetime).

Je voudrais savoir si il est possible d'obtenir la somme des quantités en moyenne par semaine pour un id_produit donné ?

Code :
1
2
3
4
5
 
SELECT SUM(quantite ) AS qte
FROM TABLE
WHERE produit_id = '1239'
GROUP BY WEEK(date_livraison)
me retourne 2 2 2 1 1 1 2

Code :
1
2
3
4
5
 
SELECT AVG(quantite ) AS qte
FROM TABLE
WHERE produit_id = '1239'
GROUP BY WEEK(date_livraison)
Me retourne 1.000 1.000 1.000 1.000 1.000 1.000 1.000

Il y a 7 résultats, ce qui est logique puisque 7 semaines se sont écoulées depuis le 1er enregistrement.

Mais la requête AVG n'est sûrement pas bonne.
En fait je voudrais la moyenne des résultats de la 1ère (SUM) , c'est à dire :

2 + 2 + 2 + 1 + 1 + 1 + 2 = 11 / 7 = 1.57
Possible en 1 requête ou je dois passer par PHP ?
Merci de vos lumières.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h38   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
En fait, la deuxième requête est pertinente, c'est juste que le type de la colonne quantité doit être INTEGER et qu'il faudrait caster le AVG en FLOAT, me semble-t-il.
Ça ne te coûte rien d'essayer, en tout cas.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h50   #3
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
C'est une sous-requête que tu veux faire ?
Code :
1
2
3
4
5
6
SELECT avg(qte)
  FROM (SELECT SUM(quantite ) AS qte
          FROM TABLE
         WHERE produit_id = '1239'
         GROUP BY WEEK(date_livraison)
        ) t
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 16h07   #4
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Merci à vous.
Et bien, en fait, skuatamad, ta requête le fait très bien.
Bonne fin de journée.
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 16h42   #5
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Argghh , non, j'ai chanté victoire trop tôt !

Si j'ai, pour un produit, une seule ligne dans la table, par exemple 5 vendus en 1 fois semaine X, la requête me retourne...5

La requête, je ne l'avais pas précisé, était déjà une requête jointe....peut-être ça, le problème ?

Code :
1
2
3
4
5
6
7
8
 
SELECT avg(t.ventes) AS vente_semaine
  FROM (SELECT SUM(ca.quantite_liv) AS ventes
         FROM commandes_articles ca 
         LEFT JOIN commandes c ON ca.commande_id = c.id
         WHERE  ca.produit_id = '1239'
         GROUP BY WEEK(c.date_livraison)
        ) t
Et moi, j'ai besoin, dans ce cas, que le résultat soit 5 / 7 semaines = 0.71
Mais j'en demande peut-être trop ?
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 17h03   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Il te faut alors une requête, ou une vue, qui recense toutes les semaines (DISTINCT) de la table, requête (ou vue) que tu mets en jointure avec la requête que t'a proposé skuatamad.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 17h05   #7
Membre confirmé
 
Avatar de renaud26
 
Inscription : mars 2003
Messages : 1 043
Détails du profil
Informations personnelles :
Âge : 48
Localisation : France, Puy de Dôme (Auvergne)

Informations forums :
Inscription : mars 2003
Messages : 1 043
Points : 285
Points : 285
Merci....mais peux-tu préciser ?
renaud26 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 18h06   #8
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Maljuna Kris, je crois que renaud26 ne veut qu'une seule ligne comme résultat, la moyenne du résultat de la requête avec la somme qui, elle, renvoie plusieurs lignes (7 dans l'exemple).

Par contre ta proposition peut être intéressante pour calculer la somme car s'il n'y a pas de quantite pour une semaine donnée il est peut être nécessaire d'avoir un 0 pour la somme ce qui ferait baisser la moyenne.
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 19h05   #9
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Citation:
Envoyé par skuatamad Voir le message
Maljuna Kris, je crois que renaud26 ne veut qu'une seule ligne comme résultat, la moyenne du résultat de la requête avec la somme qui, elle, renvoie plusieurs lignes (7 dans l'exemple).
Voui,voui, je me suis rendu compte de ma méprise lors de mon avant-dernier post.
Citation:
Envoyé par skuatamad Voir le message
Par contre ta proposition peut être intéressante pour calculer la somme car s'il n'y a pas de quantite pour une semaine donnée il est peut être nécessaire d'avoir un 0 pour la somme ce qui ferait baisser la moyenne.
C'est exactement cela.
Code SQL :
 SELECT DISTINCT WEEK(date_livraison) AS semaine FROM commandes
à mettre en table maîtresse puis LEFT JOIN de ta requête qui retourne la pseudo-table t.
A propos, jusqu'à présent, on mélange les semaines de toutes les années, à moins qu'il n'y ait une table commandes par année.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 08h10   #10
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 846
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 846
Points : 1 322
Points : 1 322
salut,

en fait, tu dois rajouter une condition sur l'année pour éviter les erreurs liés aux années consécutives avec les mêmes numéros de semaines
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h17.


 
 
 
 
Partenaires

Hébergement Web