Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requette SQL ...

5 réponses
Avatar
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.

5 réponses

Avatar
Firetox
Bonjour,

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." a écrit dans le message de
news:4a72a9a1$0$23483$
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.



Avatar
Albert P.
"Firetox" a écrit dans le message de news:
4a72adf5$0$8031$
Bonjour,

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." a écrit dans le message de
news:4a72a9a1$0$23483$
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.







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, ...)
Avatar
Firetox
Bonjour,

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



peux tu me donner la requete qui fait ce select


le résultat que je souhaite obtenir est :

1 2 11 220
2 1 23 215
3 3 7 179



quellle est la base cible
sinon je te donnerais la solution


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, ...)



comme toutes les basse mais pour faire un joke : la verite est ailleurs

Bon dev
@+

Firetox
Avatar
pyfux
Albert P. a écrit :
"Firetox" a écrit dans le message de news:
4a72adf5$0$8031$
Bonjour,

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." a écrit dans le message de
news:4a72a9a1$0$23483$
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.






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, ...)







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
Avatar
Albert P.
"pyfux" <"pyfux blabla chez free.fr"> a écrit dans le message de news:
4a754a2a$0$10219$
Albert P. a écrit :
"Firetox" a écrit dans le message de news:
4a72adf5$0$8031$
Bonjour,

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." a écrit dans le message de
news:4a72a9a1$0$23483$
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.






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, ...)







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.