Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1857 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1414623
hyptnos
GT : Gui iom
Posté le 27-07-2006 à 15:30:38  profilanswer
 

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
mood
Publicité
Posté le 27-07-2006 à 15:30:38  profilanswer
 

n°1414630
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2006 à 15:33:39  profilanswer
 

quel sgbd ?

n°1414633
Sh@rdar
Ex-PhPéteur
Posté le 27-07-2006 à 15:34:13  profilanswer
 

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
n°1414634
betsamee
Asterisk Zeperyl
Posté le 27-07-2006 à 15:35:19  profilanswer
 

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
n°1414638
hyptnos
GT : Gui iom
Posté le 27-07-2006 à 15:37:48  profilanswer
 

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

n°1414639
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2006 à 15:38:46  profilanswer
 

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

n°1414641
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2006 à 15:39:27  profilanswer
 

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

n°1414643
betsamee
Asterisk Zeperyl
Posté le 27-07-2006 à 15:40:47  profilanswer
 

tres elegant en effet
perso avec mysql je peux pas faire un group by sur un decode (ou if voir CASE d'ailleurs) :(

n°1414646
betsamee
Asterisk Zeperyl
Posté le 27-07-2006 à 15:42:01  profilanswer
 

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)

n°1414648
hyptnos
GT : Gui iom
Posté le 27-07-2006 à 15:43:11  profilanswer
 

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

mood
Publicité
Posté le 27-07-2006 à 15:43:11  profilanswer
 

n°1414682
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2006 à 15:59:22  profilanswer
 

comment c'est relou mysql :sweat:

n°1414686
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2006 à 16:00:22  profilanswer
 

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

n°1414700
betsamee
Asterisk Zeperyl
Posté le 27-07-2006 à 16:06:07  profilanswer
 

vais essayer , je crois que sign est pas encore implemente

n°1414703
Sh@rdar
Ex-PhPéteur
Posté le 27-07-2006 à 16:07:20  profilanswer
 

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
n°1414704
hyptnos
GT : Gui iom
Posté le 27-07-2006 à 16:07:31  profilanswer
 

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

n°1414710
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2006 à 16:10:37  profilanswer
 

betsamee a écrit :

vais essayer , je crois que sign est pas encore implemente


y font quoi chez mysql ? :o

n°1414713
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2006 à 16:14:42  profilanswer
 

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>

n°1414718
hyptnos
GT : Gui iom
Posté le 27-07-2006 à 16:16:18  profilanswer
 

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

n°1414719
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2006 à 16:17:40  profilanswer
 

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

n°1414722
betsamee
Asterisk Zeperyl
Posté le 27-07-2006 à 16:19:10  profilanswer
 

:jap: au temps pour moi

n°1414723
Sh@rdar
Ex-PhPéteur
Posté le 27-07-2006 à 16:20:10  profilanswer
 

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
n°1414726
hyptnos
GT : Gui iom
Posté le 27-07-2006 à 16:22:26  profilanswer
 

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

n°1414733
Sh@rdar
Ex-PhPéteur
Posté le 27-07-2006 à 16:26:17  profilanswer
 

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
n°1414736
hyptnos
GT : Gui iom
Posté le 27-07-2006 à 16:27:32  profilanswer
 

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

n°1414767
Arjuna
Aircraft Ident.: F-MBSD
Posté le 27-07-2006 à 16:47:51  profilanswer
 

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

n°1414834
hyptnos
GT : Gui iom
Posté le 27-07-2006 à 17:44:41  profilanswer
 

Et bien un grand merci  
Je met tout ca en application ce weekend j'aurais appris quelque chose aujourd'hui :)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
[Resolu] entre count(1) et count(*) lequel ?Probleme requete WMI interminable
[RESOLU] EJB : Problème méthode findAll() avec Jonas[resolu] problème d'affichage d'images sous IE
Resultat requete popup[Résolu]Aide pour la fonction preg_match +....
[RESOLU] Installeur - repertoire destination[vb6] difficulté à faire une requete sql
[javascript] passage de zone à zone [résolu mais moche] 
Plus de sujets relatifs à : [Résolu]?? Simplification d'une requete ???


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR