?? Simplification d'une requete ??? [Résolu] - SQL/NoSQL - Programmation
Marsh Posté le 27-07-2006 à 15:34:13
déjà pourquoi mettre OR years=2005 autant de fois sans parenthèse ?
SELECT COUNT(*) AS nb
FROM intervention
WHERE years='2005'
AND mois BETWEEN 1 AND 6
enfin, un truc dans le genre à adapter selon ton sgbd
EDIT : arf, à priori pas de champ date donc je vire les YEAR & MONTH
Marsh Posté le 27-07-2006 à 15:35:19
where mois in ('01','02','03','04','05','06') and years = '2005'
??
en outre ta requete a l air mechament fausse chaque (years and mois) doit etre dans des parentheses
Marsh Posté le 27-07-2006 à 15:37:48
Bas pour le moment ca fonctionne bien j'ai fait les calcul à la main et c'est tout bon
j'ai fait les essai directement en ASP et directement dans Mysql tout fonctionne bien.
Pour le SGBD mille excuse j'ai oublier de préciser, c'est Mysql avec un fonctionnement dans ASP.
bon bas j'essai tout ca
merci
Marsh Posté le 27-07-2006 à 15:38:46
Chez moi "numper" est le numéro du jour dans l'année, donc faut que tu modifie légèrement.
Deplus, j'utilise Oracle, donc sign() et decode() ne sont pas forcément disponibles sur ton SGBD. Après, tu te démerde
Code :
|
Marsh Posté le 27-07-2006 à 15:39:27
ReplyMarsh Posté le 27-07-2006 à 15:40:47
tres elegant en effet
perso avec mysql je peux pas faire un group by sur un decode (ou if voir CASE d'ailleurs)
Marsh Posté le 27-07-2006 à 15:42:01
Arjuna a écrit : sign() dispo sur sql server. ici, tu peux remplacer le decode par un if |
fonctionnera pas
sur MySQL pas de group by sur des champs conditionnels (je sais c'est tres tres pourri)
Marsh Posté le 27-07-2006 à 15:43:11
c'est bon c'est bon
Code :
|
C'est ce que je voulais encore merci
Marsh Posté le 27-07-2006 à 16:00:22
ceci dit :
Code :
|
ça marche pas sous MySQL ?
Parceque ça permet quand même de tout faire une une seule passe...
-1 : premier semestre
1 : second semestre
Marsh Posté le 27-07-2006 à 16:06:07
ReplyMarsh Posté le 27-07-2006 à 16:07:20
hum, y'a peut être moyen avec la fonction IF (et ta soustraction de mois)
Code :
|
Marsh Posté le 27-07-2006 à 16:07:31
Ajurna : Pourquoi dis tu que c'est relou Mysql? la j'ai fait un copier coller d'une partie de mon script ASP donc y a beaucoup de chose
pour Mysql
Code :
|
sa suffit
Cependant j'ai du mal à comprendre ce que tu fait avec ton sign(mois - 6.5)
Il me faut le resultat séparémment aussi et cela pour chaque année donc je pense qu'une requete par semestre est tout de même pas mal enfin je suis curieux de comprendre ta méthode par contre
Marsh Posté le 27-07-2006 à 16:10:37
betsamee a écrit : vais essayer , je crois que sign est pas encore implemente |
y font quoi chez mysql ?
Marsh Posté le 27-07-2006 à 16:14:42
hyptnos a écrit : Ajurna : Pourquoi dis tu que c'est relou Mysql?) |
Simplement parceque si t'as un historique sur 10 ans à faire, tu fais 20 requêtes consommatrices de suite, ce qui charge de façon totalement superflue la base...
hyptnos a écrit : Cependant j'ai du mal à comprendre ce que tu fait avec ton sign(mois - 6.5) |
Je veux faire ça, c'est à dire une seule et unique requête qui ramène toutes les données nécessaires (un truc propre quoi...)
Code :
|
Marsh Posté le 27-07-2006 à 16:16:18
J'ai trouver cela sur le net
Citation : |
ON voit MySQL|Oracle 8i|PostgreSQL donc sign est bien compatible avec Mysql
Marsh Posté le 27-07-2006 à 16:17:40
ben test ma requête alors... si elle marche, ce sera infiniment mieux
select count(*), year, sign(month-6.5) semestre
from test2
group by year, sign(month-6.5)
order by year, semestre
Marsh Posté le 27-07-2006 à 16:20:10
c'est vrai que ça marche en plus
(bon sinon avec mon IF ça passait aussi )
Marsh Posté le 27-07-2006 à 16:22:26
Arjuna a écrit : Simplement parceque si t'as un historique sur 10 ans à faire, tu fais 20 requêtes consommatrices de suite, ce qui charge de façon totalement superflue la base...
|
SI je comprend bien dans ton exemple
2005 -1.0 correspond au premier semestre 2005
2005 1.0 correspond au second semestre 2005
2005 -1.0 correspond au premier semestre 2006
Donc
au premier semestre 2005 il y a 12 enregistrement
au second semestre 2005 il y à 8 enregistrement
au premier semestre 2006 il y à 12 enregistrement
Il est clair que c'est pas mal et comme tu dis cela allege le code et les ressource cela dit je vois pas trop comment je peux faire pour recupérer dans une variable distinct le nombre d'enregistrement car la le resultat est directement donné par le SGBD, dans ma page ASP cela va etre différent
Marsh Posté le 27-07-2006 à 16:26:17
bin suffit de changer le WHERE
en plus ça te permettra de centraliser la requête et de pas avoir X modifs à faire si jamais tu ajoute un champ
Marsh Posté le 27-07-2006 à 16:27:32
Vrai que ca marche j'ai saisi directement dans mysql la requete
Code :
|
et il me sort
Citation : |
reste a voir pour application avec ASP
Un grand merci
Marsh Posté le 27-07-2006 à 16:47:51
pour l'asp, grossomodo :
sql = "SELECT count( * ) nb, years, sign( mois - 6.5 ) semestre FROM interventio GROUP BY years, sign( mois - 6.5 ) ORDER BY years, semestre"
rs.Open sql
if Not rs.EOF then
Response.Write "<table><tr><th>Année</th><th>Semestre</th><th>Elements</th></tr>"
Do While not rs.EOF
Response.Write "<table><tr><td>" & CStr(rs("years" )) & "</th><th>"
if rs("semestre" ) = -1 then
Response.Write "Premier"
else
Response.Write "Second"
end if
response.write "</td><td>" & CStr(rs("nb" )) & "</td></tr>"
rs.movenext
loop
Response.Write "</table>"
end if
Marsh Posté le 27-07-2006 à 17:44:41
Et bien un grand merci
Je met tout ca en application ce weekend j'aurais appris quelque chose aujourd'hui
Marsh Posté le 27-07-2006 à 15:30:38
Bonjour voila j'ai besoin de récupérer le nombre d'enregistrement contenu dans un table et cela pour chaques semestre.
Ma table est sous forme
Mois : 01; 02; 03; 04 ......
years : 2004, 2005, 2006 .....
........
donc j'ai fait cela par exemple pour 2005
Biensur cela fonctionne mais n'y aurait il pas un moyen de simplifier cette requete ?
Message édité par hyptnos le 27-07-2006 à 15:43:40