Ameliorer une requete mysql

cs_jolicoeur79 Messages postés 63 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 1 avril 2018 - Modifié par cs_jolicoeur79 le 21/11/2015 à 14:30
cs_jolicoeur79 Messages postés 63 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 1 avril 2018 - 22 nov. 2015 à 23:26
Bonjour,

salut les amis
j'ai fais un requête sur deux table mysql pour extraire des statistique annuel
ma requête constitue a extraire le nombre de durée d'emprunt des livres par rapport a l'age d'emprunteur
et je veux ameliorer cette requete car chaque fois je suis obliger de changer la valeur de l'age ex: entre 16 et 20 ans et entre 21 et 25 ans ect...
voici la requête

-----------
SELECT
sum(if(datediff( `t_emprunt`.`date_fin_empr`, `t_emprunt`.`date_debut_empr`)<=30,1,0) ) as '< mois',
sum(if(datediff( `t_emprunt`.`date_fin_empr`, `t_emprunt`.`date_debut_empr`) between 31 and 60,1,0)) as ' > mois et 02 mois',
sum(if(datediff( `t_emprunt`.`date_fin_empr`, `t_emprunt`.`date_debut_empr`) between 61 and 90,1,0)) as ' ',
.......

FROM
`t_emprunteur`
INNER JOIN `t_emprunt` ON (`t_emprunteur.`num_empr` = `t_emprunt`.`num_empr`)
where
and (year(curdate())-substring(`t_emprunteur`.`dat_naissance`,1,4) between 16 and 20)

------------

résultat après l'exécution de cette requête
< mois | > mois et 02 mois | 02 mois et 03mois
5 | 7 | 12

et je veux qu'elle s'affiche sur la forme d un tableau croisse

------------- < mois | > mois et 02 mois | 02 mois et 03mois
16 et 20 ans ----- 5 | 7 | 12
21 et 25 ans ----- 4 | 11 | 14
.......

et merci bcp
@+

--

4 réponses

NHenry Messages postés 15000 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 septembre 2022 158
21 nov. 2015 à 15:04
Si la séparation est toujours de 5 ans, tu peux peut être joué avec un Group By sur une division entière (sans chiffre après la virgule) pour grouper les résultats.
0
cs_jolicoeur79 Messages postés 63 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 1 avril 2018 1
21 nov. 2015 à 20:32
salut NHenry
non la séparation et différente selon les besoins statistique de societe
j'ai trouver une solution avec instruction union

SELECT intervale age,
sum(if(datediff( `t_emprunt`.`date_fin_empr`, `t_emprunt`.`date_debut_empr`)<=30,1,0) ) as '< mois',
sum(if(datediff( `t_emprunt`.`date_fin_empr`, `t_emprunt`.`date_debut_empr`) between 31 and 60,1,0)) as ' > mois et 02 mois',
sum(if(datediff( `t_emprunt`.`date_fin_empr`, `t_emprunt`.`date_debut_empr`) between 61 and 90,1,0)) as ' ',
.......

FROM
`t_emprunteur`
INNER JOIN `t_emprunt` ON (`t_emprunteur.`num_empr` = `t_emprunt`.`num_empr`)
where
and (year(curdate())-substring(`t_emprunteur`.`dat_naissance`,1,4) between 16 and 20)
UNION
SELECT intervale age,
sum(if(datediff( `t_emprunt`.`date_fin_empr`, `t_emprunt`.`date_debut_empr`)<=30,1,0) ) as '< mois',
sum(if(datediff( `t_emprunt`.`date_fin_empr`, `t_emprunt`.`date_debut_empr`) between 31 and 60,1,0)) as ' > mois et 02 mois',
sum(if(datediff( `t_emprunt`.`date_fin_empr`, `t_emprunt`.`date_debut_empr`) between 61 and 90,1,0)) as ' ',
.......

FROM
`t_emprunteur`
INNER JOIN `t_emprunt` ON (`t_emprunteur.`num_empr` = `t_emprunt`.`num_empr`)
where
and (year(curdate())-substring(`t_emprunteur`.`dat_naissance`,1,4) between 25 and 27)

mais le problème c'est que j'ai oblige de répéter la requête plusieurs fois et changer la partie variable

(year(curdate())-substring(`t_emprunteur`.`dat_naissance`,1,4) between 16and 20)
(year(curdate())-substring(`t_emprunteur`.`dat_naissance`,1,4) between 25 and 27)

on attendant une idee pour ameliorer cette requete merci NHenry et @+
0
NHenry Messages postés 15000 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 septembre 2022 158
21 nov. 2015 à 23:35
Si les ages ne sont pas séparés de manière réguliers, impossible de faire propre en une seule requête.
Sinon, tu peux prendre l'age dans une des données (donc groupement par age) puis tu additionne les données ligne par ligne en fonction de tes critères.
0
cs_jolicoeur79 Messages postés 63 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 1 avril 2018 1
22 nov. 2015 à 01:04
salut
Pouvez vous être plus explicite car je n'ai pas compris ce que vous voulu dire
et merci
0
NHenry Messages postés 15000 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 septembre 2022 158
22 nov. 2015 à 20:06
En gros, tu peux faire une requête SQL qui te donne pour chaque age les informations, puis tu fait les calculs sur les résultats obtenus.
0
cs_jolicoeur79 Messages postés 63 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 1 avril 2018 1 > NHenry Messages postés 15000 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 septembre 2022
22 nov. 2015 à 23:26
ok NHenry
je vais essaie et merci pour tous
0