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

Minimum sur un même Id

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

4 réponses

Avatar
Michel__D
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" a écrit dans le message de 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





Avatar
Michel__D
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"
<mailto: a écrit dans le message de
news: gki860$ire$
<mailto: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"
<mailto: a écrit dans le message de
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
>>
>>
>>
>
>


Avatar
Michel__D
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"
<mailto: a écrit dans le message
de news: gki860$ire$
<mailto: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"
<mailto: a écrit dans le message de
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
>>
>>
>>
>
>




Avatar
Eric Beaumard
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" a écrit dans le message de
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"
<mailto: a écrit dans le message de
news: gki860$ire$
<mailto: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"
<mailto: a écrit dans le message de
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
>>
>>
>>
>
>