Minimum sur un même Id

Le
Eric Beaumard
Bonjour,

I need help

J'ai une table T constituée d'un champ Id (ldenficateur unique)
et d'une valeur Val qui est un flottant. Extrait (oubliez pour l'instant
les (*)):

ID Val
1 3.2
1 12.0
1 2.1
1 -1.1 (*)
1 4.9
2 9.9
2 8.3
2 3.4
2 -4.1 (*)
3 2.5
3 1.2 (*)
4 5.3 (*)
4 23.9
4 -21.3
4 99.2

Je voudrais écrire une requête qui me sorte les enregistrements
où val est minimum sur l'étendu d'un même Id, ce qui donnerait donc
les enregistrements repérés par (*) dans la table T donnée au-dessus.

Je sais faire ça en VB. Mais je voudrais savoir si ce genre de problème
peut être écrit sous forme de requête SQL sous Access.

Cordialement

E.BEAUMARD
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michel__D
Le #18377171
Bonjour,

Théoriquement avec une requête (mode SQL) cela devrait donner ceci :

SELECT T.ID, Min( T.Val ) AS ValeurMini
FROM T
GROUP BY T.ID;


"Eric Beaumard"
Bonjour,

I need help ...

J'ai une table T constituée d'un champ Id (ldenficateur unique)
et d'une valeur Val qui est un flottant. Extrait (oubliez pour l'instant
les (*)):

ID Val
1 3.2
1 12.0
1 2.1
1 -1.1 (*)
1 4.9
2 9.9
2 8.3
2 3.4
2 -4.1 (*)
3 2.5
3 1.2 (*)
4 5.3 (*)
4 23.9
4 -21.3
4 99.2

Je voudrais écrire une requête qui me sorte les enregistrements
où val est minimum sur l'étendu d'un même Id, ce qui donnerait donc
les enregistrements repérés par (*) dans la table T donnée au-dessus.

Je sais faire ça en VB. Mais je voudrais savoir si ce genre de problème
peut être écrit sous forme de requête SQL sous Access.

Cordialement

E.BEAUMARD





Michel__D
Le #18379511
Re,

Un regroupement (sur les enregistrements) est généralement réalisé
pour effectuer une opération sur ces enregistrements et certaines
opérations n'ont théoriquement de sens que lorsque les champs
regroupés possèdent des valeurs communes.

Et dans ton dernier cas tu rajoute un champ qui n'a pas de valeur
qui se répète et donc ton regroupement ne te fournit pas le résultat
escompté.

Par contre lorsque l'on souhaite récupèrer la valeur d'un champ qui
ne peut pas être dans un regroupement, il faut réaliser le
regroupement qui permet de récupérer les valeurs liées à la clé
primaire puis dans une deuxième requête effectuer une jointure
entre la table et la 1ère requête afin de rapatrier les valeurs
des champs voulus.

Exemple :

Voici la requête qui détermine les valeurs de la clé primaire que
l'on nommera "requeteTemp" :

SELECT T.ID, Min(T.COTE) AS MinDeCOTE
FROM T
GROUP BY T.ID;

Puis la 2ème requête qui permet de récupérer les valeurs d'autres
champs correspondant aux valeurs de la clé primaire :

SELECT T.ID, requeteTemp.MinDeCOTE, T.[DUP_12]
FROM T INNNER JOIN requeteTemp
ON T.ID = requeteTemp.ID;

ou

SELECT T.ID, T.COTE, T.[DUP_12]
FROM T INNNER JOIN requeteTemp
ON T.ID = requeteTemp.ID;


Eric Beaumard a écrit :
Merci pour cette réponse qui m'aide beaucoup. Cependant et pour
une raison que je comprends pas certains champs de la table
(car pour faire court je ne les ai pas tous donnés dans mon message
précédant: il en a d'autres: ID,Val, ND_2,DUP_12, etc.) que j'inclue
pourtant dans le GROUP BY détruisent le regroupement.

Par exemple, cette requête fonctionne bien:

SELECT T.ID, Min(T.COTE) AS MinDeCOTE, T.LF1
FROM T
GROUP BY T.ID, T.LF1;

Et donne:

ID MinDeCOTE LF1
1 5.4 20
2 3.1 12
3 4 12
4 1.9 8
5 3.4 13
6 2.9 10
7 3.2 18
8 4.5 14
9 5.4 15
10 2.9 8
11 4 12
12 2.1 11
13 4.2 14
14 3.6 10


Mais si je prends la variable DUP_12 ca ne fonctionne plus (plus de
group by):


SELECT T.ID, Min(T.COTE) AS MinDeCOTE, T.DUP_12
FROM T
GROUP BY T.ID, T.DUP_12;


ID MinDeCOTE DUP_12
1 97 5
1 70 10
1 11 15
1 33 20
1 19 25
1 43 30
1 64 35
1 7.4 40
1 14 45
1 17 50
1 64 55
1 63 60
1 90 65
1 5.4 70
1 18 75
1 17 80
1 14 85
1 11 90
1 12 95
1 10 100
2 19 8
2 8.3 17
2 24 25
2 7.5 33
2 10 42
2 3.1 50
2 23 58
2 12 67
2 19 75
2 28 83
2 9.3 92
2 12 100
3 15 8
3 30 17
3 4 25
3 76 33
3 19 42
3 9.3 50
3 36 58
3 7.4 67
3 8.3 75
3 4.1 83
3 12 92
3 24 100



Là je ne comprends pas (non plus), ces deux variables sont du
type numérique, double dans la définition de T. Rien, à priori
ne les différencie. Si ce n'est leur contenu. Mais en quoi
ce contenu pourrait affecter le group by ?

Eric






"Michel__D"
news: gki860$ire$
> Bonjour,
>
> Théoriquement avec une requête (mode SQL) cela devrait donner ceci :
>
> SELECT T.ID, Min( T.Val ) AS ValeurMini
> FROM T
> GROUP BY T.ID;
>
>
> "Eric Beaumard"
news:496c9c3b$0$21354$
>> Bonjour,
>>
>> I need help ...
>>
>> J'ai une table T constituée d'un champ Id (ldenficateur unique)
>> et d'une valeur Val qui est un flottant. Extrait (oubliez pour l'instant
>> les (*)):
>>
>> ID Val
>> 1 3.2
>> 1 12.0
>> 1 2.1
>> 1 -1.1 (*)
>> 1 4.9
>> 2 9.9
>> 2 8.3
>> 2 3.4
>> 2 -4.1 (*)
>> 3 2.5
>> 3 1.2 (*)
>> 4 5.3 (*)
>> 4 23.9
>> 4 -21.3
>> 4 99.2
>>
>> Je voudrais écrire une requête qui me sorte les enregistrements
>> où val est minimum sur l'étendu d'un même Id, ce qui donnerait donc
>> les enregistrements repérés par (*) dans la table T donnée au-dessus.
>>
>> Je sais faire ça en VB. Mais je voudrais savoir si ce genre de problème
>> peut être écrit sous forme de requête SQL sous Access.
>>
>> Cordialement
>>
>> E.BEAUMARD
>>
>>
>>
>
>


Michel__D
Le #18386711
Bonjour,

Hum, j'étais pas trés réveillé pour écrire cette prose.

Bon même si tout ce que j'ai dit n'est pas complétement exact,
l'idée est de se servir des valeurs qui caractérisent une ligne
afin de rapatrier les valeurs d'autres champs.

Ce qui donne pour la 2ème requête (aprés correction) :

SELECT T.ID, requeteTemp.MinDeCOTE, T.[DUP_12]
FROM T INNNER JOIN requeteTemp
ON (T.ID = requeteTemp.ID) And (T.COTE = requeteTemp.MinDeCOTE);

PS:Il faut bien entendu que la valeur du champ qui a servi à isoler
chaque ligne soit unique.


Michel__D a écrit :
Re,

Un regroupement (sur les enregistrements) est généralement réalisé
pour effectuer une opération sur ces enregistrements et certaines
opérations n'ont théoriquement de sens que lorsque les champs
regroupés possèdent des valeurs communes.

Et dans ton dernier cas tu rajoute un champ qui n'a pas de valeur
qui se répète et donc ton regroupement ne te fournit pas le résultat
escompté.

Par contre lorsque l'on souhaite récupèrer la valeur d'un champ qui
ne peut pas être dans un regroupement, il faut réaliser le
regroupement qui permet de récupérer les valeurs liées à la clé
primaire puis dans une deuxième requête effectuer une jointure
entre la table et la 1ère requête afin de rapatrier les valeurs
des champs voulus.

Exemple :

Voici la requête qui détermine les valeurs de la clé primaire que
l'on nommera "requeteTemp" :

SELECT T.ID, Min(T.COTE) AS MinDeCOTE
FROM T
GROUP BY T.ID;

Puis la 2ème requête qui permet de récupérer les valeurs d'autres
champs correspondant aux valeurs de la clé primaire :

SELECT T.ID, requeteTemp.MinDeCOTE, T.[DUP_12]
FROM T INNNER JOIN requeteTemp
ON T.ID = requeteTemp.ID;

ou

SELECT T.ID, T.COTE, T.[DUP_12]
FROM T INNNER JOIN requeteTemp
ON T.ID = requeteTemp.ID;


Eric Beaumard a écrit :
Merci pour cette réponse qui m'aide beaucoup. Cependant et pour
une raison que je comprends pas certains champs de la table
(car pour faire court je ne les ai pas tous donnés dans mon message
précédant: il en a d'autres: ID,Val, ND_2,DUP_12, etc.) que j'inclue
pourtant dans le GROUP BY détruisent le regroupement.

Par exemple, cette requête fonctionne bien:

SELECT T.ID, Min(T.COTE) AS MinDeCOTE, T.LF1
FROM T
GROUP BY T.ID, T.LF1;

Et donne:

ID MinDeCOTE LF1 1 5.4 20 2 3.1 12 3 4 12 4
1.9 8 5 3.4 13 6 2.9 10 7 3.2 18 8 4.5 14 9
5.4 15 10 2.9 8 11 4 12 12 2.1 11 13 4.2 14
14 3.6 10

Mais si je prends la variable DUP_12 ca ne fonctionne plus (plus de
group by):


SELECT T.ID, Min(T.COTE) AS MinDeCOTE, T.DUP_12
FROM T
GROUP BY T.ID, T.DUP_12;


ID MinDeCOTE DUP_12 1 97 5 1 70 10 1 11 15 1
33 20 1 19 25 1 43 30 1 64 35 1 7.4 40 1 14
45 1 17 50 1 64 55 1 63 60 1 90 65 1 5.4 70
1 18 75 1 17 80 1 14 85 1 11 90 1 12 95 1
10 100 2 19 8 2 8.3 17 2 24 25 2 7.5 33 2
10 42 2 3.1 50 2 23 58 2 12 67 2 19 75 2 28
83 2 9.3 92 2 12 100 3 15 8 3 30 17 3 4 25
3 76 33 3 19 42 3 9.3 50 3 36 58 3 7.4 67 3
8.3 75 3 4.1 83 3 12 92 3 24 100


Là je ne comprends pas (non plus), ces deux variables sont du
type numérique, double dans la définition de T. Rien, à priori
ne les différencie. Si ce n'est leur contenu. Mais en quoi
ce contenu pourrait affecter le group by ?

Eric






"Michel__D"
de news: gki860$ire$
> Bonjour,
>
> Théoriquement avec une requête (mode SQL) cela devrait donner ceci :
>
> SELECT T.ID, Min( T.Val ) AS ValeurMini
> FROM T
> GROUP BY T.ID;
>
>
> "Eric Beaumard"
news:496c9c3b$0$21354$
>> Bonjour,
>>
>> I need help ...
>>
>> J'ai une table T constituée d'un champ Id (ldenficateur unique)
>> et d'une valeur Val qui est un flottant. Extrait (oubliez pour
l'instant
>> les (*)):
>>
>> ID Val
>> 1 3.2
>> 1 12.0
>> 1 2.1
>> 1 -1.1 (*)
>> 1 4.9
>> 2 9.9
>> 2 8.3
>> 2 3.4
>> 2 -4.1 (*)
>> 3 2.5
>> 3 1.2 (*)
>> 4 5.3 (*)
>> 4 23.9
>> 4 -21.3
>> 4 99.2
>>
>> Je voudrais écrire une requête qui me sorte les enregistrements
>> où val est minimum sur l'étendu d'un même Id, ce qui donnerait donc
>> les enregistrements repérés par (*) dans la table T donnée
au-dessus.
>>
>> Je sais faire ça en VB. Mais je voudrais savoir si ce genre de
problème
>> peut être écrit sous forme de requête SQL sous Access.
>>
>> Cordialement
>>
>> E.BEAUMARD
>>
>>
>>
>
>




Eric Beaumard
Le #18399831
Merci beaucoup pour cette aide consciencieuse ! J'avais trouvé qu'il fallait
rajouter la jointure sur la cote. Il va absolument falloir que je me
mette sérieusement à SQL, je ne m'en sers qu'occasionnellement
pour extraire quelques donnée.

Bonne journée.

Eric.




"Michel__D" news:
Bonjour,

Hum, j'étais pas trés réveillé pour écrire cette prose.

Bon même si tout ce que j'ai dit n'est pas complétement exact,
l'idée est de se servir des valeurs qui caractérisent une ligne
afin de rapatrier les valeurs d'autres champs.

Ce qui donne pour la 2ème requête (aprés correction) :

SELECT T.ID, requeteTemp.MinDeCOTE, T.[DUP_12]
FROM T INNNER JOIN requeteTemp
ON (T.ID = requeteTemp.ID) And (T.COTE = requeteTemp.MinDeCOTE);

PS:Il faut bien entendu que la valeur du champ qui a servi à isoler
chaque ligne soit unique.


Michel__D a écrit :
Re,

Un regroupement (sur les enregistrements) est généralement réalisé
pour effectuer une opération sur ces enregistrements et certaines
opérations n'ont théoriquement de sens que lorsque les champs
regroupés possèdent des valeurs communes.

Et dans ton dernier cas tu rajoute un champ qui n'a pas de valeur
qui se répète et donc ton regroupement ne te fournit pas le résultat
escompté.

Par contre lorsque l'on souhaite récupèrer la valeur d'un champ qui
ne peut pas être dans un regroupement, il faut réaliser le
regroupement qui permet de récupérer les valeurs liées à la clé
primaire puis dans une deuxième requête effectuer une jointure
entre la table et la 1ère requête afin de rapatrier les valeurs
des champs voulus.

Exemple :

Voici la requête qui détermine les valeurs de la clé primaire que
l'on nommera "requeteTemp" :

SELECT T.ID, Min(T.COTE) AS MinDeCOTE
FROM T
GROUP BY T.ID;

Puis la 2ème requête qui permet de récupérer les valeurs d'autres
champs correspondant aux valeurs de la clé primaire :

SELECT T.ID, requeteTemp.MinDeCOTE, T.[DUP_12]
FROM T INNNER JOIN requeteTemp
ON T.ID = requeteTemp.ID;

ou

SELECT T.ID, T.COTE, T.[DUP_12]
FROM T INNNER JOIN requeteTemp
ON T.ID = requeteTemp.ID;


Eric Beaumard a écrit :
Merci pour cette réponse qui m'aide beaucoup. Cependant et pour
une raison que je comprends pas certains champs de la table
(car pour faire court je ne les ai pas tous donnés dans mon message
précédant: il en a d'autres: ID,Val, ND_2,DUP_12, etc.) que j'inclue
pourtant dans le GROUP BY détruisent le regroupement.
Par exemple, cette requête fonctionne bien:
SELECT T.ID, Min(T.COTE) AS MinDeCOTE, T.LF1
FROM T
GROUP BY T.ID, T.LF1;
Et donne:
ID MinDeCOTE LF1 1 5.4 20 2 3.1 12 3 4 12 4 1.9
8 5 3.4 13 6 2.9 10 7 3.2 18 8 4.5 14 9 5.4 15
10 2.9 8 11 4 12 12 2.1 11 13 4.2 14 14 3.6 10
Mais si je prends la variable DUP_12 ca ne fonctionne plus (plus de
group by):

SELECT T.ID, Min(T.COTE) AS MinDeCOTE, T.DUP_12
FROM T
GROUP BY T.ID, T.DUP_12;

ID MinDeCOTE DUP_12 1 97 5 1 70 10 1 11 15 1 33
20 1 19 25 1 43 30 1 64 35 1 7.4 40 1 14 45 1
17 50 1 64 55 1 63 60 1 90 65 1 5.4 70 1 18
75 1 17 80 1 14 85 1 11 90 1 12 95 1 10 100 2
19 8 2 8.3 17 2 24 25 2 7.5 33 2 10 42 2 3.1
50 2 23 58 2 12 67 2 19 75 2 28 83 2 9.3 92 2
12 100 3 15 8 3 30 17 3 4 25 3 76 33 3 19 42
3 9.3 50 3 36 58 3 7.4 67 3 8.3 75 3 4.1 83 3
12 92 3 24 100 Là je ne comprends pas (non plus), ces deux
variables sont du
type numérique, double dans la définition de T. Rien, à priori
ne les différencie. Si ce n'est leur contenu. Mais en quoi
ce contenu pourrait affecter le group by ?
Eric

"Michel__D"
news: gki860$ire$
> Bonjour,
>
> Théoriquement avec une requête (mode SQL) cela devrait donner ceci :
>
> SELECT T.ID, Min( T.Val ) AS ValeurMini
> FROM T
> GROUP BY T.ID;
>
>
> "Eric Beaumard"
news:496c9c3b$0$21354$
>> Bonjour,
>>
>> I need help ...
>>
>> J'ai une table T constituée d'un champ Id (ldenficateur unique)
>> et d'une valeur Val qui est un flottant. Extrait (oubliez pour
l'instant
>> les (*)):
>>
>> ID Val
>> 1 3.2
>> 1 12.0
>> 1 2.1
>> 1 -1.1 (*)
>> 1 4.9
>> 2 9.9
>> 2 8.3
>> 2 3.4
>> 2 -4.1 (*)
>> 3 2.5
>> 3 1.2 (*)
>> 4 5.3 (*)
>> 4 23.9
>> 4 -21.3
>> 4 99.2
>>
>> Je voudrais écrire une requête qui me sorte les enregistrements
>> où val est minimum sur l'étendu d'un même Id, ce qui donnerait donc
>> les enregistrements repérés par (*) dans la table T donnée
au-dessus.
>>
>> Je sais faire ça en VB. Mais je voudrais savoir si ce genre de
problème
>> peut être écrit sous forme de requête SQL sous Access.
>>
>> Cordialement
>>
>> E.BEAUMARD
>>
>>
>>
>
>






Publicité
Poster une réponse
Anonyme