Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/05/2011, 11h47   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
Par défaut requête avec agrégat

Bonjour,
Je dois faire une requête simple sur une même table, et je n'arrive pas à conclure!
Je souhaite en gros la requête combinée ci-dessous mais qui ne marche pas :
Code sql :
1
2
3
4
5
6
7
8
SELECT  ColumnD, ColumnX, MIN(ColumnAP)
FROM FileInput_GAMS1_ZGAMS
GROUP BY ColumnD, ColumnX
IN
(SELECT ColumnD, ColumnX, ColumnAN, ColumnAP
FROM FileInput_GAMS1_ZGAMS
WHERE ColumnAP <> '2'
ORDER BY  ColumnD, ColumnX, ColumnAN DESC, ColumnAP)
Au depart :
ColonneC, ColonneD, ColonneX, ColonneAN, ColonneAO, ColonneAP
AP - 2121 - 50052899- 30- INCINSP4 - 2
AP - 2121 - 50052899- 70 - CRAFT - 1
AP - 2121 - 50052899- 20 - QQQQ - 0
AP - 2121 - 50052899- 10 - PRO - 3
MI - 2191 - 10052899- 70 - CRAFT - 0
MI - 2191 - 10052899- 30- INCINSP4 - 0
MI - 2191 - 10052899- 20 - CRAFT - 3
MI - 2191 - 10052899- 10 - CRAFT - 1

A l'arrivée je souhaite la plus petite valeur de la colonne P avec comme prérequis un sort DESC sur la colonne AN pour le cas ou 2 valeurs min identique sur la colonne AP. Et je dois éliminer de la recherche les lignes dont ColonneAp =2. Soit en gras les lignes résultat après le tri :
AP - 2121 - 50052899- 70 - CRAFT - 1
AP - 2121 - 50052899- 30- INCINSP4 - 2
AP - 2121 - 50052899- 20 - QQQQ - 0
AP - 2121 - 50052899- 10 - PRO - 3
MI - 2191 - 10052899- 70 - CRAFT - 0
MI - 2191 - 10052899- 30- INCINSP4 - 0
MI - 2191 - 10052899- 20 - CRAFT - 3
MI - 2191 - 10052899- 10 - CRAFT - 1

Merci d'avance de votre support.
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 19h15   #2
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 411
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 411
Points : 4 440
Points : 4 440
bonsoir,

essayons une solution par jointure pour voir:

Code sql :
1
2
3
4
5
6
7
8
9
10
11
SELECT T1.ColumnD, T1.ColumnX, T2.miniAP 
FROM FileInput_GAMS1_ZGAMS T1
INNER JOIN
(
  SELECT ColumnD, ColumnX, MIN(ColumnAP) AS miniAP
  FROM FileInput_GAMS1_ZGAMS 
  WHERE ColumnAP<>2
  GROUP BY ColumnD, ColumnX
) T2
ON T1.ColumnD=T2.ColumnD AND T1.ColumnX=T2.ColumnX
ORDER BT T1.ColumnD, T1.ColumnX, T1.ColumnAN DESC, T1.ColumnAP ;
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/05/2011, 23h53   #3
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
Remerciements sincères pour votre aide.
Je vais tester votre solution jeudi sur un cas concret en l'adaptant à mon besoin (en congés demain).

Votre solution fonctionne sur un cas d'école, c'est déjà une bonne chose car je n'arrivais à rien. Par contre cela me renvoi l'ensemble des lignes avec un GROUP BY un peu particulier or je ne souhaite que la ligne résultat.

Je vous tiens informé.
Cordialement,
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 00h03   #4
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 411
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 411
Points : 4 440
Points : 4 440
peut-être plutôt comme ça alors:

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT 
T1.ColonneC, 
T1.ColonneD, 
T1.ColonneX, 
T1.ColonneAN, 
T1.ColonneAO, 
T1.ColonneAP 
FROM FileInput_GAMS1_ZGAMS T1
INNER JOIN
(
  SELECT ColumnD, ColumnX, MIN(ColumnAP) AS miniAP
  FROM FileInput_GAMS1_ZGAMS 
  WHERE ColumnAP<>2
  GROUP BY ColumnD, ColumnX
) T2
ON T1.ColumnD=T2.ColumnD AND T1.ColumnX=T2.ColumnX
     AND T1.ColumnAP=T2.miniAP
ORDER BT T1.ColumnD, T1.ColumnX, T1.ColumnAN DESC, T1.ColumnAP ;

et sinon tant pis pour ce soir

bonne nuit
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 18h12   #5
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
Votre solution est très proche, merci pour l'apprentissage de ce formalisme très clair.

Il y a un manque dans le cas particulier (voir mon exemple n°2) ou 2 lignes possèdent le même nombre min. Dans ce cas la requête doit éliminer la deuxième ligne.

Le résultat avec votre deuxième requête solution:
MI - 2191 - 10052899- 70 - CRAFT - 0
MI - 2191 - 10052899- 30- INCINSP4 - 0

En gros le min doit être exclusif avec le DESC (seule la première ligne doit être conservée). J'espère que je suis clair, je cherche aussi la soluce de mon côté . Merci.
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 19h27   #6
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 411
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 411
Points : 4 440
Points : 4 440
mmmmhh...

si j'appelle "R_miniAP" la requête de mon message précédent, on peut rajouter une couche du genre:

Code sql :
1
2
3
4
5
6
7
8
9
SELECT * FROM R_miniAP
WHERE R_miniAP.columnAN=
(
   SELECT TOP 1 T1.columnAN FROM R_miniAP T1
   WHERE T1.columnD=R_miniAP.columnD
       AND T1.columnX=R_miniAP.columnX
   ORDER BY T1.columnAN DESC, T1.columnAO
)
ORDER BY ColumnD, ColumnX

technique avec TOP 1 que l'on aurait d'ailleurs pu retenir pour "R_miniAP"
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/05/2011, 23h28   #7
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
cela ne marche pas, boucle infinie, mon portable se transforme en radiateur
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 12h08   #8
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
Bonjour,
Après plusieurs essais ce matin j'ai le même problème de plantage. Si je fais un ctrl+pause pendant la requête ACCESS semble pourtant me renvoyer les bonnes valeurs.

Est-ce l'appel d'une autre requête dans une requête qui perturbe ACCESS 2007? le formalisme de ta solution f-leb? Est-il possible de faire qu'une seule requête?

La solution est proche, en plus je me fais mettre la pression, il faut vraiment que j'arrive à conclure :-) Merci de votre aide.
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 12h22   #9
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 411
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 411
Points : 4 440
Points : 4 440
bonjour,

est-ce que tu peux mettre un extrait de ta base en pièce-jointe ?
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 14h07   #10
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
Pour cette combinaison ColumnD + ColumnX dans la table
ColumnC ColumnD ColumnX ColumnAN ColumnAO ColumnAP
DSAZNS ZAC061013-08 150012237 20 PR 2
DSAZNS ZAC061013-08 150012237 30 II 2
DSAZNS ZAC061013-08 150033470 10 SCI 2
DSAZNS ZAC061013-08 150033470 20 PR 2
DSAZNS ZAC061013-08 150033470 30 II 2
DSAZNS ZAC061013-08 150053127 10 SCI 0
DSAZNS ZAC061013-08 150053127 20 PR 0
DSAZNS ZAC061013-08 150053127 25 IllI 0
DSAZNS ZAC061013-08 150053127 30 II 0
DSAZNS ZAC061013-08 150053127 40 DOC 0

la requête R_miniAP filtre bien :
ColumnC ColumnD ColumnX ColumnAN ColumnAO ColumnAP
DSAZNS ZAC061013-08 150053127 40 DOC 0
DSAZNS ZAC061013-08 150053127 30 II 0
DSAZNS ZAC061013-08 150053127 25 IllI 0
DSAZNS ZAC061013-08 150053127 20 PR 0
DSAZNS ZAC061013-08 150053127 10 SCI 0

la requête RMain devrait retourner uniquement
ColumnC ColumnD ColumnX ColumnAN ColumnAO ColumnAP
DSAZNS ZAC061013-08 150053127 40 DOC 0
Fichiers attachés
Type de fichier : zip BddTest.zip (300,3 Ko, 10 affichages)
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 15h35   #11
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 411
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 411
Points : 4 440
Points : 4 440
je ne sais pas comment tu as réglé ton plantage mais chez moi la requête R_main semble aussi tourné en boucle Le fichier serait-il corrompu ?

Citation:
la requête RMain devrait retourner uniquement
ColumnC ColumnD ColumnX ColumnAN ColumnAO ColumnAP
DSAZNS ZAC061013-08 150053127 40 DOC 0
tu as un tri sur la colonne AN
Code sql :
ORDER BY T1.columnAN DESC
, or cette colonne est de type "Texte". Le problème vient peut-être de là, il faudrait mettre ta colonne AN de type "numérique".
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 16h45   #12
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
Le fichier mis en pièce jointe sur le forum est réalisé from scratch. Par ailleurs la modification en numérique des colonnes AP et AN ne corrige pas le problème, grrrrr.

Quelqu'un a une idée?

N'existe-t-il pas un autre formalisme de la requête R_MAIN?
Elle semble faire planter le moteur ACCESS dès l'exécution?

Je suis preneur de toute solution.
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 17h13   #13
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 411
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 411
Points : 4 440
Points : 4 440
désolé, je ne comprends pas

d'autant plus que je viens de faire un essai sur une nouvelle base (voir pièce-jointe) qui semble fonctionner avec ces codes.

Peut-être faudrait-il faire une réparation de ton fichier (il y a un tuto là-dessus je ne sais plus où).


[EDIT] j'ai tenté une réparation en ligne de commande, marche pas non plus

[/EDIT]
Fichiers attachés
Type de fichier : zip teuzadur.zip (26,4 Ko, 12 affichages)
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/05/2011, 23h12   #14
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 411
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 411
Points : 4 440
Points : 4 440
bon, alors en fait la requête avec TOP 1 est vraiment très très lente.

Citation:
Envoyé par teuzadur
N'existe-t-il pas un autre formalisme de la requête R_MAIN?
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
T1.ColumnC, 
T1.ColumnD, 
T1.ColumnX, 
T1.ColumnAN, 
T1.ColumnAO, 
T1.ColumnAP
FROM R_miniAP AS T1 INNER JOIN 
( 
  SELECT ColumnD, ColumnX, Max(ColumnAN) AS MaxiAN 
  FROM R_miniAP 
  GROUP BY ColumnD, ColumnX
)  AS T2 
  ON (T1.ColumnD=T2.ColumnD) AND (T1.ColumnX=T2.ColumnX) 
       AND (T1.ColumnAN=T2.maxiAN)
  ORDER BY T1.ColumnD, T1.ColumnX;

qui est beaucoup plus rapide.
f-leb est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/05/2011, 09h31   #15
Candidat au titre de Membre du Club
 
Inscription : janvier 2006
Messages : 39
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 39
Points : 13
Points : 13
Bravo! celle-ci marche super bien avec les bonnes valeurs en retour.
Chapeau bas Monsieur Gaston.

Je n'ai pas compris pourquoi l'autre requête combinée plantait.
Je reproduit le même problème ailleurs avec une autre requête combinée (pareil même problème de perf malgré les compact and repair).

Encore merci de votre support et du temps passé.
teuzadur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h15.


 
 
 
 
Partenaires

Hébergement Web