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

améliorer ma requete sql

16 réponses
Avatar
Papilou
Bonjour à tous, et merci de votre aide
voila mon problème
La requête suivante :
SELECT Ligne, Min(PK_deb) AS MinDePK_deb, Max(PK_fin) AS MaxDePK_fin, ELECT
FROM Dec_ligne
GROUP BY Ligne, ELECT
HAVING Ligne="930000";

Me donne ce résultat
Ligne MinDePK_deb MaxDePK_fin ELECT
930000 0 259,155 1500V
930000 5,448 257,475 25000V

La table d'origine est celle-ci :
Ligne PK_deb PK_fin ELECT
930000 0 0,114 1500V
930000 0,114 2,3 1500V
930000 2,3 3,258 1500V
930000 5,443 5,448 1500V
930000 5,448 12,12 25000V
930000 12,12 12,82 25000V
930000 12,82 13,3 25000V
930000 251,934 252,4 25000V
930000 252,4 257,475 25000V
930000 257,475 259,155 1500V

Moi je cherche à obtenir ceci
Ligne MinDePK_deb MaxDePK_fin ELECT
930000 0 5,448 1500V
930000 5,448 257,475 25000V
930000 257,475 259,155 1500V

Je pense qu'il est necessaire de programmer un peu... non?
Je ne pense pas réaliser cela en une seule requête .... si?
Alors comment faire? puis-je avoir de l'aide?
merci

6 réponses

1 2
Avatar
Papilou
Je ne pense pas que tu ai vraiment envie de m'aider n'est-ce pas?
Alors laisses tomber c'est plus sympat
:o))))))))))))))
Avatar
Papilou
Non, car avec la prgrammation, lorsque ELECT change j'affiche la ligne et je
continu, donc, je devrais avoir 3 lignes aulieu de 2...

Enfin je pense

"Richard_35" a écrit dans le message de news:

Excuses-moi, mais là, tu te retrouveras avec le résultat de la requête SQL
dont tu parlais au début et qui ne te convient pas !


"Papilou" a écrit dans le message de news:
446f2e73$0$9008$
Avec mes excuses, mais je pensais avoir été clair.
Je n'ai pas la solution.
première question est-ce possible en SQL. (personnellement je ne pense
pas il n'y a pas de moyen de changer la table de départ. Donc pas de
colonne supplémentaire.

Seconde question est-ce possible en VBA ? oui je pense, mais je ne sais
pas faire.
Je ne sais pas ou mettre le programme, comment le lancer, etc etc ....

Voila ce que je pense qu'il faudrait faire :
En pseudo VBA et francais :

Dim db As Database
Dim reponse As Recordset
Dim sql As String
Set db = CurrentDb()

sql = "SELECT Ligne, PK_deb, PK_fin, ELECT FROM Dec_ligne WHERE Ligne
LIKE '930000';"
Set reponse = db.OpenRecordset(strRst, dbOpenDynaset)

Eregistrement = 1
L=ligne de enregistrement1
PD=PK_deb de enregidtrement 1
PF=PK_fin de l'enregistrement 1
E=ELECT de l'enregistrement 1

While Not reponse.EOF
je prends l'enregistrement suivant
Si PK_deb<PD je met PK_deb dans PD
Si PK_fin >PF je met PK_fin dans PF
Si ELECT =E
je conserve les champs ligne, ELECT dans des variables L,E
Sinon
j'affiche la ligne L,PD,PF,E
fin de Si
Wend

reponse.Close: Set reponse = Nothing
db.Close: Set db = Nothing








Avatar
Bonjour

Je poste juste pour dire que j'y suis arrivé mais avec une table de quelques milliers d'enregistrements, on risque un dépassement de
capacité !!

J'ai fait 2 requêtes qui définissent les bornes à prendre en compte :

Requête DebutSegments :
SELECT Dec_ligne.Ligne, Dec_ligne.PK_deb, Dec_ligne.ELECT, Dec_ligne.PK_fin
FROM Dec_ligne
WHERE (((DCount("*","Dec_ligne","PK_fin=" & [Pk_deb] & " AND ELECT ='" & [ELECT] & "'"))=0))
GROUP BY Dec_ligne.Ligne, Dec_ligne.PK_deb, Dec_ligne.ELECT, Dec_ligne.PK_fin;

Requête FinSegments :
SELECT Dec_ligne.Ligne, Dec_ligne.PK_fin, Dec_ligne.ELECT, Dec_ligne.PK_deb
FROM Dec_ligne
WHERE (((DCount("*","Dec_ligne","PK_deb=" & [Pk_fin] & " AND ELECT ='" & [ELECT] & "'"))=0))
GROUP BY Dec_ligne.Ligne, Dec_ligne.PK_fin, Dec_ligne.ELECT, Dec_ligne.PK_deb;


ensuite, il faudrait juxtaposer les 2 requêtes et c'est là que ça se complique car aucun identifiant commun pour numéroter les
lignes :

Requete Union2
SELECT DebutSegments.Ligne, DebutSegments.PK_deb, FinSegments.PK_fin, DebutSegments.ELECT
FROM DebutSegments INNER JOIN FinSegments ON (DebutSegments.PK_deb = FinSegments.PK_deb) AND (DebutSegments.ELECT =
FinSegments.ELECT) AND (DebutSegments.Ligne = FinSegments.Ligne)
UNION SELECT DebutSegments.Ligne, DebutSegments.PK_deb, FinSegments.PK_fin, DebutSegments.ELECT
FROM DebutSegments INNER JOIN FinSegments ON (DebutSegments.PK_fin = FinSegments.PK_deb) AND (DebutSegments.Ligne =
FinSegments.Ligne) AND (DebutSegments.ELECT = FinSegments.ELECT);


et requete PasdansUnion2
SELECT DebutSegments.Ligne, DebutSegments.PK_deb, FinSegments.PK_fin, DebutSegments.ELECT
FROM DebutSegments INNER JOIN FinSegments ON (DebutSegments.ELECT = FinSegments.ELECT) AND (DebutSegments.Ligne = FinSegments.Ligne)
WHERE (((DebutSegments.PK_deb) Not In (select PK_deb from Union2;)) AND ((FinSegments.PK_fin) Not In (select PK_fin from Union2;)));


Enfin, une requete union sur ces 2 dernières :
select * from pasdansunion2
UNION sElect * FROM UNION2;


et le résultat :
Ligne PK_deb PK_fin ELECT
930000 0 3.258 1500V
930000 5.443 5.448 1500V
930000 5.448 13.3 25000V
930000 251.934 257.475 25000V
930000 257.475 259.155 1500V

oui ce n'est pas tout à fait ce qui était demandé,
mais pour cela il fallait avoir des segments contigus


voilà, si ça peut aider à optimiser la méthode...

a+
--
Arnaud
---------------------------------------------
infos, conseils et liens : http://www.mpfa.info
---------------------------------------------




"Papilou" a écrit dans le message de news: 446f358a$0$12798$
sur la premiere ligne je trouve 1500V
tant que je ne change pas je suis sur le premier groupe
puis je trouve 25000V je suis sur le second groupe
puis je retrouve 1500V je suis sur le troisieme groupe

Une requete ne suffit pas, j'en suis convaincu, mais je n'ai pas la solution.



Avatar
Richard_35
Donc, c'est bien ce que je t'avais dit : c'est l'ordre des enregistrements,
dans le fichier, qui détermine les différents groupes.
Les groupes sont définis par lecture séquentielle du fichier et rupture sur
le couple Ligne, ELECT.
Dans ce cas, effectivement, il faut du code pour tester la rupture par
rapport à l'enregistrement précédent et stocker, au coup par coup, les Min
et les Max.
Mais c'est une méthode qui n'est pas très élégante : il suffit que, pour une
raison ou pour une autre, l'ordre des enregistrements change et tu es
marron.

Quant à t'écrire le code, je ne suis pas un "cador" en VBA, a spécialité
est, plutôt, l'analyse et, je trouve ce fichier mal construit pour le
résultat que tu souhaites.

Bon courage,
Richard.

"Papilou" a écrit dans le message de news:
446f358a$0$12798$
sur la premiere ligne je trouve 1500V
tant que je ne change pas je suis sur le premier groupe
puis je trouve 25000V je suis sur le second groupe
puis je retrouve 1500V je suis sur le troisieme groupe

Une requete ne suffit pas, j'en suis convaincu, mais je n'ai pas la
solution.



Avatar
J-Pierre
Si tu regardais un peu ce NG, tu constaterais que je réponds souvent, peut-être pas toujours juste, mais souvent. Et je
réponds à tout le monde, si je n'avais pas peur de te vexer, je dirais même à toi, mais c'est une plaisanterie. Dire que je
n'ai pas vraiment envie de t'aider, c'est me faire un procès d'intention :-)

Bref, nous restons bons amis, bonne chance avec ton problème.

J-Pierre
Avatar
Papilou
Merci anor, je vois ce que je peu faire avec cela.
1 2