[Résolu]?? Simplification d'une requete ???

?? Simplification d'une requete ??? [Résolu] - SQL/NoSQL - Programmation

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
 

Code :
  1. SELECT COUNT(*) as nb FROM intervention WHERE years='2005' and mois='01' OR years='2005' and mois='02' OR years='2005' and mois='03' OR years='2005' and mois='04' OR years='2005' and  mois='05' OR years='2005' and mois='06'


 
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
Reply

Marsh Posté le 27-07-2006 à 15:30:38   

Reply

Marsh Posté le 27-07-2006 à 15:33:39    

quel sgbd ?

Reply

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
 


Message édité par Sh@rdar le 27-07-2006 à 15:35:28

---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

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


Message édité par betsamee le 27-07-2006 à 15:38:02
Reply

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

Reply

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 :p
 

Code :
  1. select count(*), annee, decode(sign(numper - 183), -1, 'Premier semestre', 'Second semestre')
  2. from psk
  3. where codsoc = 2
  4. group by annee, decode(sign(numper - 183), -1, 'Premier semestre', 'Second semestre')
  5. order by 2, 3

Reply

Marsh Posté le 27-07-2006 à 15:39:27    

sign() dispo sur sql server. ici, tu peux remplacer le decode par un if

Reply

Marsh 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) :(

Reply

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)

Reply

Marsh Posté le 27-07-2006 à 15:43:11    

c'est bon c'est bon
 

Code :
  1. <%
  2. sql1 = "SELECT COUNT(*) AS nb FROM intervention WHERE years='2005' AND mois BETWEEN '01' AND '06'"
  3. set rs = conn.execute(sql1)
  4. if not rs.EOF then
  5.   response.write rs("nb" )
  6. end if
  7. sql2 = "SELECT COUNT(*) AS nb FROM intervention WHERE years='2005' AND mois BETWEEN '07' AND '12' "
  8. set rs = conn.execute(sql2)
  9. if not rs.EOF then
  10.   response.write rs("nb" )
  11. end if
  12. %>


 
C'est ce que je voulais encore merci :)

Reply

Marsh Posté le 27-07-2006 à 15:43:11   

Reply

Marsh Posté le 27-07-2006 à 15:59:22    

comment c'est relou mysql :sweat:

Reply

Marsh Posté le 27-07-2006 à 16:00:22    

ceci dit :
 

Code :
  1. group by year, sign(mois - 6.5)


 
ça marche pas sous MySQL ?
 
Parceque ça permet quand même de tout faire une une seule passe...
 
-1 : premier semestre
1 : second semestre

Reply

Marsh Posté le 27-07-2006 à 16:06:07    

vais essayer , je crois que sign est pas encore implemente

Reply

Marsh Posté le 27-07-2006 à 16:07:20    

hum, y'a peut être moyen avec la fonction IF (et ta soustraction de mois)
 

Code :
  1. SELECT
  2. COUNT(*) AS total,
  3. IF ( (mois-6.5)>0,-1,1) AS semestre
  4. FROM matable
  5. WHERE year = 2005
  6. GROUP BY semestre


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

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 :
  1. SELECT COUNT(*) AS nb FROM intervention WHERE years='2005' AND mois BETWEEN '01' AND '06'


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

Reply

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 ? :o

Reply

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 :
  1. Microsoft Windows [version 5.2.3790]
  2. (C) Copyright 1985-2003 Microsoft Corp.
  3. C:\Documents and Settings\Administrateur>osql -E
  4. 1> use magicsite
  5. 2> go
  6. 1> select top 10 * from test2
  7. 2> go
  8. year        month       dtc
  9. ----------- ----------- ----
  10.         2005           1    1
  11.         2005           3    1
  12.         2005           4    1
  13.         2005           8    1
  14.         2005           9    1
  15.         2006           1    1
  16.         2006           1    1
  17.         2006           2    1
  18.         2005           1    1
  19.         2005           3    1
  20. (10 lignes affectées)
  21. 1> select count(*), year, sign(month-6.5) semestre
  22. 2> from test2
  23. 3> group by year, sign(month-6.5)
  24. 4> order by year, semestre
  25. 5> go
  26.              year        semestre
  27. ----------- ----------- --------------
  28.           12        2005           -1.0
  29.            8        2005            1.0
  30.           12        2006           -1.0
  31. (3 lignes affectées)
  32. 1> exit
  33. C:\Documents and Settings\Administrateur>

Reply

Marsh Posté le 27-07-2006 à 16:16:18    

J'ai trouver cela sur le net
 

Citation :


SIGN(nombre)  MySQL|Oracle 8i|PostgreSQL  
Retourne -1 si le nombre passé en paramètre est négatif, 0 s'il est nul ou 1 s'il est positif.  
monchamp SIGN(monchamp)  
-2 -1  
0 0  
2 1  
SELECT monchamp, SIGN(monchamp) FROM matable  
 


 
ON voit MySQL|Oracle 8i|PostgreSQL donc sign est bien compatible avec Mysql

Reply

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

Reply

Marsh Posté le 27-07-2006 à 16:19:10    

:jap: au temps pour moi

Reply

Marsh Posté le 27-07-2006 à 16:20:10    

c'est vrai que ça marche en plus [:dawa]
 
(bon sinon avec mon IF ça passait aussi :ange:)


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

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...
 
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 :
  1. Microsoft Windows [version 5.2.3790]
  2. (C) Copyright 1985-2003 Microsoft Corp.
  3. C:\Documents and Settings\Administrateur>osql -E
  4. 1> use magicsite
  5. 2> go
  6. 1> select top 10 * from test2
  7. 2> go
  8. year        month       dtc
  9. ----------- ----------- ----
  10.         2005           1    1
  11.         2005           3    1
  12.         2005           4    1
  13.         2005           8    1
  14.         2005           9    1
  15.         2006           1    1
  16.         2006           1    1
  17.         2006           2    1
  18.         2005           1    1
  19.         2005           3    1
  20. (10 lignes affectées)
  21. 1> select count(*), year, sign(month-6.5) semestre
  22. 2> from test2
  23. 3> group by year, sign(month-6.5)
  24. 4> order by year, semestre
  25. 5> go
  26.              year        semestre
  27. ----------- ----------- --------------
  28.           12        2005           -1.0
  29.            8        2005            1.0
  30.           12        2006           -1.0
  31. (3 lignes affectées)
  32. 1> exit
  33. C:\Documents and Settings\Administrateur>



 
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

Reply

Marsh Posté le 27-07-2006 à 16:26:17    

bin suffit de changer le WHERE [:spamafote]
 
en plus ça te permettra de centraliser la requête et de pas avoir X modifs à faire si jamais tu ajoute un champ


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
Reply

Marsh Posté le 27-07-2006 à 16:27:32    

Vrai que ca marche j'ai saisi directement dans mysql la requete
 

Code :
  1. SELECT count( * ) , years, sign( mois - 6.5 ) semestre
  2. FROM intervention
  3. GROUP BY years, sign( mois - 6.5 )
  4. ORDER BY years, semestre


 
et il me sort
 

Citation :


count(*) years semestre  
46 2004 1  
154 2005 -1  
133 2005 1  


 
reste a voir pour application avec ASP
 
Un grand merci :)

Reply

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

Reply

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 :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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