Requette SQL ...
Le
Albert P.
Bonjour,
J'ai un fichier historique qui contient (entre autres) un N° de voiture, un
nombre de passagers, l'identifiant du conducteur, l'heure de départ et total
kilométrique parcouru.
Pour chaque voiture, je peux avoir 15 à 20 enregistrements.
J'ai fait la requette suivante :
select numV,nb_pass,id_conduct,min(heure_top),sum(qte_km)
from tab_top_car
group by numV,nb_pass
order by numV
L'objectif étant d'avoir la liste des véhicules,le nombre de passagers, le
conducteur initial du véhicule, l'heure de départ (1er top) et le total
kilometrique parcouru.
Mon soucis est qu'en cours de route, le conducteur peut changer et dans ce
cas, je me retrouve avec plusieurs lignes pour un véhicule (normal vu ma
requette)
Je souhaiterais donc avoir le conducteur du 1er top manque de chance,
min(id_conduct) ne peut pas fonctionner car l'id du conducteur principal
n'est pas forcément la plus petite ID, first(id_conduct) ne fonctionne pas
Comment modifier ma requette de façon à avoir l'id_conduct du 1er top ?
La seule solution que j'ai trouvée pour l'instant consiste à remplacer
id_conduct par min(num_top) et de faire un hlitrecherche sur mon fichier
pour lire l'id du conducteur du 1er top pas très élégant
Des idées ???
Merci d'avance,
Albert P.
J'ai un fichier historique qui contient (entre autres) un N° de voiture, un
nombre de passagers, l'identifiant du conducteur, l'heure de départ et total
kilométrique parcouru.
Pour chaque voiture, je peux avoir 15 à 20 enregistrements.
J'ai fait la requette suivante :
select numV,nb_pass,id_conduct,min(heure_top),sum(qte_km)
from tab_top_car
group by numV,nb_pass
order by numV
L'objectif étant d'avoir la liste des véhicules,le nombre de passagers, le
conducteur initial du véhicule, l'heure de départ (1er top) et le total
kilometrique parcouru.
Mon soucis est qu'en cours de route, le conducteur peut changer et dans ce
cas, je me retrouve avec plusieurs lignes pour un véhicule (normal vu ma
requette)
Je souhaiterais donc avoir le conducteur du 1er top manque de chance,
min(id_conduct) ne peut pas fonctionner car l'id du conducteur principal
n'est pas forcément la plus petite ID, first(id_conduct) ne fonctionne pas
Comment modifier ma requette de façon à avoir l'id_conduct du 1er top ?
La seule solution que j'ai trouvée pour l'instant consiste à remplacer
id_conduct par min(num_top) et de faire un hlitrecherche sur mon fichier
pour lire l'id du conducteur du 1er top pas très élégant
Des idées ???
Merci d'avance,
Albert P.

Poser une question


pour cela il faut deja avoir la requete sans les sum et min qui correspond a
ce que tu demande
avoir par exemple X ligne de voiture conducteur avec en premier le
conducteur que tu veux
ensuite c'est cette requete qui servira a faire le select avec les calcul
(donc un Form (selec.....) group by
car le group by groupe toujours sur la premeir ligne :
par exemple
TOTO 1 34
TOTO 2 63
TITI 4 78
TITI 5 99
si je group sur les La premier colonne j'airais
TOTO 1
TITI 4
mais si j'inverse le resultat
TOTO 2 63
TOTO 1 34
TITI 5 99
TITI 4 78
alors le grup by donnera
TOTO 2
TITI 5
donc il suffit d'avoir le TOTO et titi comme on veut avant de faire la
requete qui groupera
ce mecanisme est tres important pour par exemple avoir sur des date la bonne
date dans la requete final sans faire de min ou de max il suffit que le
order de la date soit celui qu'on veut ensuite on passe cette requete dans
une autre qui elle fait le group by
voila donc dans ton cas je chercherais deja la requete qui me presente tous
les vehicules avec tous les conducteur mais ordonné comme il faut ensuite la
requete sera facilement transformée pour faire les sum et group by
Bon dev
@+
"Albert P." news:4a72a9a1$0$23483$
Entièrement d'accord avec toi sur le principe ...
mon fichier ressemble à ça
numv nbocc idcond km
1 2 11 110
1 2 11 67
1 2 6 43
2 1 23 110
2 1 23 95
3 3 7 54
3 3 9 67
3 3 1 58
le résultat que je souhaite obtenir est :
1 2 11 220
2 1 23 215
3 3 7 179
J'ai beau triturer dans tous les sens, pour avoir mon cumul de km par
voiture (le nb d'occupants ne change jamais) je fais un group by par
numV,nbocc avec un sum (km) ... nickel ... par contre pour obtenir le 1er
conducteur ... dur dur.
Si je laisse idcond dans ma requette tel quel, je dois le rajouter dans le
group by et alors je n'ai plus 1 ligne par voiture mais 1 ligne par
voiture/conducteur.
J'ai tenté de faire select numV,nbocc,idcond,sum(km) from tab_top_car group
by numV,nbocc order by numV (je n'ai pas mis le idcond dans le group by) ...
malheureusement, marequette.idcond me renvoi toujours 0 ... (bug de windev
???)
Si je tente le min(idcond) ... je n'obtiens que le plus petit idcond (qui
n'est pas forcément le 1er conducteur)
Albert P.
Nota : ma plus grande expérience du SQL concerne Informix et pour cette
base, il n'est pas possible de faire un sum(xxxx) sans faire un group by de
toutes les rubriques non recalculés (count, sum, min, max, ...)
peux tu me donner la requete qui fait ce select
quellle est la base cible
sinon je te donnerais la solution
comme toutes les basse mais pour faire un joke : la verite est ailleurs
Bon dev
@+
Firetox
Bonjour,
Une solution avec des sous-requêtes jointes:
SELECT a.numv, a.heure,b.dst,c.id_conduct FROM ( SELECT min(heure_top)
as heure, numV FROM TAB_TOP_CAR GROUP BY numv) as A LEFT JOIN ( SELECT
sum(qte_km) as dst, numv FROM TAB_TOP_CAR GROUP BY numv ) b ON
a.numv=b.numv INNER JOIN ( SELECT id_conduct,numv,nb_pass,heure_top FROM
TAB_TOP_CAR ) as C on a.numv=c.numv and a.heure=c.heure_top
Pas très propre mais fonctionne.
Code Windev:
sSQL1="SELECT min(heure_top) as heure, numV FROM TAB_TOP_CAR GROUP BY numv"
sSQL2="SELECT sum(qte_km) as dst, numv FROM TAB_TOP_CAR GROUP BY numv"
sSQL3="SELECT id_conduct,numv,nb_pass,heure_top FROM TAB_TOP_CAR"
sSQL4="SELECT a.numv, a.heure,b.dst,c.id_conduct FROM ( " + sSQL1 + ")
as A LEFT JOIN ( " + sSQL2 + " ) b ON a.numv=b.numv INNER JOIN ( " +
sSQL3 + " ) as C on a.numv=c.numv and a.heure=c.heure_top "
SI HExécuteRequêteSQL(sdData,hRequêteDéfaut,sSQL4) ALORS
PyFux
Merci beaucoup ... je teste ça ce matin.
Il est vrai que j'ai de grosses lacunes concernant les jointures ... je ne
les ai jamais utilisées professionnellement (trop de wlangage :-) et l'école
c'est loin.
Albert P.