Menu

Calcul dans une colonne F le % de chaque valeur de la colonne E sur son total [Résolu]

Messages postés
29
Date d'inscription
lundi 3 décembre 2007
Dernière intervention
19 février 2019
- - Dernière réponse : ESCOUGER
Messages postés
29
Date d'inscription
lundi 3 décembre 2007
Dernière intervention
19 février 2019
- 5 févr. 2019 à 17:44
Bonjour,

J'ai créé une table avec 5 colonnes. (A à E)

J'aimerai créer une sixième colonne F dont chaque ligne contienne le les valeurs de la colonne E, divisées par le total de cette même colonne E.

Ex Col E =

10

30

160
TOTAL = 200

Col F devrait contenir
5
15
80

Merci d'avance de votre aise, je débute avec Access.



--
Afficher la suite 

Votre réponse

7 réponses

Messages postés
7425
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 février 2019
439
0
Merci
bonjour,
il est recommandé de ne pas enregistrer de valeur calculée.
suggestion:
select *, E/dsum("E","t")*100 as F from t;
ESCOUGER
Messages postés
29
Date d'inscription
lundi 3 décembre 2007
Dernière intervention
19 février 2019
-
Bonsoir,
Désolé mais je ne comprends pas cette réponse.
Quelques questions complémentaires:

Que représente "T" et ou dois-je le décrire?
Ou inscrire cette formule? Si je la saisis dans la définition de ma colonne cela n'est pas accepté.
La colonne "F" va-t-elle se générer directement?
J'entends par col "E" est le "nom" de ma colonne (=Légende dans les propriétés). Est-ce bien ce que vous entendez aussi ?

Serait-il possible de reproduire ce cas dans une petite exemple de requête que vous écririez et me retransmettriez?

Merci de votre compréhension
yg_be
Messages postés
7425
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 février 2019
439 > ESCOUGER
Messages postés
29
Date d'inscription
lundi 3 décembre 2007
Dernière intervention
19 février 2019
-
il s'agit d'une requête, et t est à remplacer par le nom de la table.
Commenter la réponse de yg_be
Messages postés
29
Date d'inscription
lundi 3 décembre 2007
Dernière intervention
19 février 2019
0
Merci
Je pense n'avoir pas été assez clair dans ma demande. Il faut dire que c'est mon second jour avec Access et sans formation serieuse.
J'ai crée une requête s'appuyant sur une seule table.
Cette requête renvoie 2 colonnes.
Col 1 correspond à la colonne "année" de ma table "ADHERENTS"
Elle est déclarée du type "Regroupement"
Col 2 correspond à la colonne "Nombre de" de la même
table "ADHERENTS" (contient des valeurs numériques
exclusivement)
Elle est déclarée du type "Compte"
Cette colonne est totalisée en bas du tableau

Je souhaite créer une colonne 3 qui, pour chacune des lignes du résultat présente le rapport de ce qui figure en colonne 2 par rapport au total de cette colonne 2.

Exemple:

Valeurs de col 2 10,30,160 Total = 200

Valeurs souhaitées en col 3 5%,15%80%
10/200 = 5 30/200 = 15% 160/200 = 80%

Que dois-je écrire et ou pour obtenir dans cette colonne 3 ces valeurs.

Voyez ma requête ci-dessous

SELECT ADHERENTS.Né, Count(ADHERENTS.Né) FROM ADHERENTS GROUP BY ADHERENTS.Né
ORDER BY ADHERENTS.Né;

J'espère avoir été plus clair.
Merci d'avance de votre aide.



--
yg_be
Messages postés
7425
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 février 2019
439 -
je te conseille d'être plus précis et plus factuel:
- pourquoi fais-tu ce travail?
- tu mentionnes un champ "année" dans ta table: est-ce réellement le nom correct?
Commenter la réponse de ESCOUGER
Messages postés
7425
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 février 2019
439
0
Merci
suggestion pour ta nouvelle demande:
SELECT Né, Count(Né), Count(Né)/dcount("Né","ADHERENTS") 
FROM ADHERENTS 
GROUP BY Né 
ORDER BY Né; 

ou bien
SELECT Né, Count(Né), Count(Né)/tot *100
FROM ADHERENTS, (select count(*) as tot from ADHERENTS ) as t
GROUP BY Né, tot 
ORDER BY Né;
Commenter la réponse de yg_be
Messages postés
29
Date d'inscription
lundi 3 décembre 2007
Dernière intervention
19 février 2019
0
Merci
Merci, je suis arrivé à ce que je souhaitais initialement en scindant les étapes via des tables intermédiaires et en suivant vos avis.
Mais un nouvelle difficulté s'est maintenant faite jour qui remet tout en cause!

Le contexte est le suivant. Je souhaite bâtir une pyramides des âges de randonneurs avec pour chaque année le nombre de d'adhérents ayant marché et le % de chaque année sur le total.

Je dispose d'une table des adhérents contenant 2 colonnes.
Le nom de l'adhérent
La date de naissance

Je dispose aussi d'une table des randonneurs contenant 2 colonnes
Le nom du marcheur
Le nombre de randonnées effectuées


Je ne dois restituer que les marcheurs figurant dans la table des adhérents (Jointure sur le Nom) et dont la date de naissance est différente de "Vide".


Exemple:

Table des adhérents:

Antoine; 1980
Marine; "vide"
Bertrand; 1990
Nicole; 1980
José; 2000


Table des randonneurs:

Antoine; 10
Marine; 5
Bertrand; 4
Nicole; 6
Tartempion; 1

José ne sera pas dans le résultat car il n'a pas randonné
Tartempion ne sera pas dans le résultat car il n'est pas adhérent
Marine ne sera pas dans le résultat car sa date de naissance est "Vide"

Le résultat escompté est :

Col 1 Année de naissance
Col 2 Nbre de marcheurs

Col 3 % de Col 2 sur total col 2


Col4 Somme des jours de marche effectués pour année de col 1

Col5 % de col 4 sur total col 4


Col1 Col2 Col3 Col4 Col5


1980 2 66% 16 80%

1990 1 33% 4 20%


Total 3 100% 20 100%



J'espère que tout cela est suffisamment clair et que tout ceci soit contenu dans une seule requête si tant est que cela soit possible?

Merci de votre aide et de votre patience



--
yg_be
Messages postés
7425
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 février 2019
439 -
je propose de travailler avec 2 requêtes en cascade, pour que ce soit plus lisible:
la première, que j'appelle esc_q:
SELECT esc_adh.perso, esc_adh.naiss, esc_march.marches
FROM esc_adh INNER JOIN esc_march ON esc_adh.perso = esc_march.perso
WHERE naiss is not null;

la seconde, qui utilise la première et te donnerait tout le résultat attendu:
SELECT esc_q.naiss, count(*), round(count(*)/tot*100), 
      sum(esc_q.marches), round(sum(esc_q.marches)/summ*100)
FROM esc_q, 
     (SELECT count(*) AS tot FROM esc_q)  AS t, 
     (SELECT sum(marches) AS summ FROM esc_q)  AS s
GROUP BY naiss, tot, summ;

tu dois adapter cela en mettant le nom exact de tes tables et de tes champs.
moi j'ai travaillé avec:
une table esc_adh ayant les champs perso et naiss
une table esc_march ayant les champs perso et marches
Commenter la réponse de ESCOUGER
Messages postés
29
Date d'inscription
lundi 3 décembre 2007
Dernière intervention
19 février 2019
0
Merci
C'est extra, c'est exactement ce que souhaitais obtenir.
Merci beaucoup.

Actuellement je lance la première requête puis ensuite la seconde.
Est-il possible de lancer une seule "procédure?" qui exécutera la première requête puis le seconde sans autre intervention manuelle ?

yg_be
Messages postés
7425
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 février 2019
439 -
il est inutile de lancer la première requête, la seconde y fait appel automatiquement.
Commenter la réponse de ESCOUGER
Messages postés
29
Date d'inscription
lundi 3 décembre 2007
Dernière intervention
19 février 2019
0
Merci
Merci infiniment pour votre patience, votre compétence et aussi votre réactivité.
100% du sujet a été traité et le résultat est exactement ce que je souhaitais. De plus j'ai appris et compris quelques techniques qui ne manqueront pas de me resservir.
Je vais aussi m'acheter un bouquin spécialisé access car il semble que ce soit plus ardu que cela n'apparaît de prime abord!
yg_be
Messages postés
7425
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
19 février 2019
439 -
super, peux-tu marquer comme résolu via la roue dentée à droite du titre?
Commenter la réponse de ESCOUGER
Messages postés
29
Date d'inscription
lundi 3 décembre 2007
Dernière intervention
19 février 2019
0
Merci
OK C'est fait

Commenter la réponse de ESCOUGER