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 16/03/2011, 10h45   #1
Invité régulier
 
Inscription : août 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 13
Points : 6
Points : 6
Par défaut Aide pour requête

Bonjour et d'avance merci pour votre aide

J'ai une table histo qui me sert à historiser le nombre de pages imprimées par mes imprimantes avec 4 champs :
-idhisto clef primaire
-idimp id de mon imprimante
-nbxpages compteur de l'imprimante
-date date de relevé du compteur

Tous les jours, un script php récupère en snmp le compteur des imprimantes.

Avec la requête suivante, j'arrive à sortir le nombre de pages imprimées dans le mois choisi, février dans mon exemple :

Code :
1
2
3
4
5
SELECT idimp,max(nbxpages)-min(nbxpages) AS NBX 
FROM histo 
WHERE date_format(date,'%m')='02' 
GROUP BY id_imp 
ORDER BY NBX DESC LIMIT 0,5
Je voudrais récupérer la même chose, mais sur plusieurs mois, pour avoir les 5 plus grosses impressions par mois, comme suit :

janvier - Imprimante5 - 2500 pages
janvier - Imprimante3 - 1500 pages
janvier - Imprimante4 - 800 pages
janvier - Imprimante2 - 500 pages
janvier - Imprimante1 - 200 pages
Février - Imprimante9 - 2600 pages
Février - Imprimante5 - 1200 pages
Février - Imprimante3 - 750 pages
Février - Imprimante7 - 450 pages
Février - Imprimante5 - 250 pages

etc...Etc

D'avance merci
sebonsun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 10h57   #2
Membre habitué
 
Développeur informatique
Inscription : juillet 2002
Messages : 96
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2002
Messages : 96
Points : 120
Points : 120
Bonjour,

tu pourrais essayer ca :


Code :
1
2
3
4
5
6
 
SELECT date_format(date,'%Y-%m'), idimp ,max(nbxpages)-min(nbxpages) AS NBX 
FROM histo 
GROUP BY date_format(date,'%Y-%m'), id_imp 
ORDER BY NBX DESC 
LIMIT 0,5
Normalement tu auras tous les résultats groupés par année-mois et ensuite imprimantes.
A toi de filtrer ensuite sur les mois.


Cordialement.
__________________
Je connais des gens qui ne sont pas aware, il ne sont pas qu courant. il ne sont pas a l'attention de savoir qu'ils existent.
"J-C Van dam"
Lharuun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 11h38   #3
Invité régulier
 
Inscription : août 2007
Messages : 13
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 13
Points : 6
Points : 6
Bonjour Lharuun et merci

Cela ne fonctinne pas car il ne renvoie que 5 résultat et non les 5 premier de chaque mois et ensuite le min et le max pris en compte ne sont pas les bons.

En gros il ne prends pas le max du mois de février mois le min du mois de février pour les soustraires dans ta requête.

Merci quand meme
sebonsun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 15h54   #4
Membre confirmé
 
Inscription : novembre 2007
Messages : 134
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 134
Points : 213
Points : 213
Par défaut une solution

Bonjour,
J'ai déjà fait cela sous Sql Server avec ROW_NUMBER ... mais Mysql est trop limité et ne sait pas faire.
Cependant, j'ai rapidement fait un test en local chez moi et avec une sous requête cela semble fonctionner, j'ai juste simplifié la colonne du mois et limité à 2 pour mon jeu de test, je vous laisse adapter cela à votre cas :
Code :
1
2
3
4
5
6
 
SELECT mois, idimp, max(nbxpages)-min(nbxpages) AS NBX 
FROM histo t1
GROUP BY mois, idimp 
HAVING NBX >= (SELECT max(nbxpages)-min(nbxpages) AS NBX FROM histo WHERE mois = t1.mois GROUP BY idimp ORDER BY NBX DESC LIMIT 1,1 ) 
ORDER BY mois, NBX DESC
Dites nous si jamais vous trouvez une autre solution, cela m'intéresse.
Bon courage.
patic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2011, 22h07   #5
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Bonjour,

Ce qui se fait très facilement sous d'autres SGBD (PostgreSQL, Oracle, SQL Server par exemple) avec les fonctions de fenêtrage devient rapidement la galère sous MySQL, qui ne dispose pas de ces fonctionnalités...
Enfin, c'est faisable en une (grosse) requête (à tester tout de même) :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT mois, idimp, nbx
FROM (
	SELECT date_format(date,'%m') AS mois, idimp, max(nbxpages)-min(nbxpages) AS nbx 
	FROM histo 
	GROUP BY date_format(date,'%m'), idimp 
) h1
WHERE (
	SELECT COUNT(*)
	FROM (
		SELECT date_format(date,'%m') AS mois, idimp, max(nbxpages)-min(nbxpages) AS nbx 
		FROM histo 
		GROUP BY date_format(date,'%m'), idimp 
	) h2
	WHERE h2.mois = h1.mois
	AND h2.nbx > h1.nbx
) < 5
ORDER BY mois, nbx DESC;
Mais franchement, c'est pas joli-joli, bourré de sous-requêtes, alors qu'avec les fonctions de fenêtrage, ça aurait été plus simple...

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced 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 18h57.


 
 
 
 
Partenaires

Hébergement Web