[RESOLU] calcul de pourcentage

Eléphant du PHP | 84 Messages

23 mai 2014, 23:00

Bonsoir,

Je tourne en rond avec une requete sql que je ne trouve pas du tout
J'ai une table vente qui comprend nom, produit....
Je cherche a calculer le pourcentage de produit

table vente

vendeur | produit

John | produit1
peter | produit1
jeff | produit2
peter | produit3
jeff | produit3
peter | produit1
john | produit2
...
Quelle est le pourcentage de produit1, de produit 2 etc...
Merci de votre aide

Mammouth du PHP | 2278 Messages

24 mai 2014, 07:32

Question ambiguë:
produit1/somme des produits)
ou
produit1 pour vendeur1 /somme du produit1 pour tous les vendeurs ?
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 84 Messages

24 mai 2014, 11:21

Bonjour,

pour répondre à ta question, ca serai plutot le 1er choix.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 mai 2014, 13:22

Salut,

Sujet déplacé dans la bonne section ;)

En sql l'on compte avec la fonction count ;)

De quoi a t'on besoin ?
- le nombre totale de vente
- le nombre de vente par produit
- le calcul de pourcentage

Le nombre total de vente c'est simple
Select count(1) as total from vente 
Le nombre de vente par produit demande un groupement des données pour compter. Pour cela on utilise : group by
Select count(1) as nb from vente group by produit;
Le calcul de pourcentage pour un produit :
(Nombre de produit x 100) / nombre total de produit.

Reste a mettre tout cela dans une seule requête.

Select ((count(1) * 100)/ (select count(1) from vente)) as pct, produit from vente group by produit;
Une requête dans ce goût la devrait t'aider.
C'est a tester bien entendu ;)

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

24 mai 2014, 13:48

@moogli:
quand tu fais un "select count..." comet récupères-tu le résultat avec PHP ?
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 84 Messages

24 mai 2014, 17:49

Super moogli, ca fonctionne parfaitement.
Mais j'ai certains champs qui sont vides et j'aimerai bien ne pas en tenir compte.
J'ai essayé avec un IS NOT NULL mais ca ne fonctionne pas. :oops:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 mai 2014, 20:48

Me faut plus d'info parce que la c'est pas simple
Pense a avoir le même prédicat dans les deux select.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 84 Messages

24 mai 2014, 22:06

Juste que parfois le vendeur n'a pas vendu donc dans le champs produit il n'y a rien
table vente

vendeur | produit

John | produit1
peter |
jeff | produit2
peter | produit3
jeff | produit3
peter |
john | produit2
...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 mai 2014, 10:39

as tu bien mis le même prédicat pour les deux requêtes ?
est ce que ton champ null ou est ce qu'il s'agit d'une chaîne de caractère vide ? (ce n'est pas la même chose).
SELECT ((COUNT(1) * 100)/ (
SELECT COUNT(1)
FROM vente
WHERE produit IS NOT NULL AND produit <>'')) AS pct, produit
FROM vente
WHERE produit IS NOT NULL AND produit <>''
GROUP BY produit;
j'en profite pour te dire que ton modèle de données est foireux.
- tu ne devrais pas avoir de ligne vide (cela ce calcul simplement si besoin)
- tu as des doublons dans les données c'est pas bon (ère forme normale).

tu devrais avoir quelque chose comme ceci
mcd_vente.png
ce qui donne ceci en terme de ddl (MySQL mais le principe et la structure des table est le même pour les autres).
[mysql]CREATE TABLE vendeur(
idvendeur int (11) Auto_increment NOT NULL ,
nom Varchar (25) NOT NULL ,
PRIMARY KEY (idvendeur )
)ENGINE=InnoDB;


CREATE TABLE produit(
idproduit int (11) Auto_increment NOT NULL ,
nomproduit Varchar (25) NOT NULL ,
description Varchar (25) NOT NULL ,
PRIMARY KEY (idproduit )
)ENGINE=InnoDB;


CREATE TABLE vendre(
idvendeur Int NOT NULL ,
idproduit Int NOT NULL ,
PRIMARY KEY (idvendeur ,idproduit )
)ENGINE=InnoDB;

ALTER TABLE vendre ADD CONSTRAINT FK_vendre_idvendeur FOREIGN KEY (idvendeur) REFERENCES vendeur(idvendeur);
ALTER TABLE vendre ADD CONSTRAINT FK_vendre_idproduit FOREIGN KEY (idproduit) REFERENCES produit(idproduit);[/mysql]

une tel structure permet des mises à jour simple et une meilleur maintenance ;)

@+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Il en faut peu pour être heureux ......

Mammouth du PHP | 2278 Messages

25 mai 2014, 14:00

J'ajoiuterai à ce que moogli ne dit pas dans sa modestie, je suppose, c'est que:
Les formes normales dont il parle sont théorisées depuis au moins 30 ans et sont une quasi nécessité dès qu'on cherche à faire quelque chose de sérieux.
La complexité apparente nécessite beaucoup d'attention lors de la création des tables et des codes.
Une Base bien conçue peut répondre aux questions qu'on se posait et, en général, aux questions qu'on se posera. de toute façon, il sera facile de la faire évoluer.
J'en parle en connaissance de cause pour avoir ignoré ce point dans une mienne application que j'ai dû repenser et réécrire en grande partie pour pouvoir répondre à une question que je n'avais pas prévue et qui semblait évidente à l'utilisateur : c'étéaient des élèves, des profs d différentes matières et des classes contenant des élèves suivant différentes matières, pas les mêmes pour tous. "Et que fait-on, me dit-on au changement de cllasse et d'options?"...
Je ne sias pas s'il a signalé l'adresse de l'outil dont il se sert pour créer son modèle de BDD; ça vaudrait le coup qu'il la rappelle.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 84 Messages

25 mai 2014, 14:16

Merci moogli, ca fonctionne parfaitement.
Pour ce qui est de la table, c’était juste un exemple. Mes tables sont construites différemment.
Et effectivement, une table 'produit' serait logique pour un site de vente de produits, ce qui n'est pas mon cas.
J'utilise le champs 'produit' comme information de la même manière qu'un champs 'nom', prénom', 'adresse', etc...
Par contre j'avoue que mon exemple est erroné car dans le champ vendeur il ne peut pas y avoir de doublons.
Merci en tout cas pour ces informations et pour la solution.
Bon dimanche à tous :mrgreen:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 mai 2014, 21:45

De rien ;)

Sirakawa : j'utilise jmerise (jfreesoft).
C'est fait en java, valide le modèle et permet de créer le ddl pour mysql, Oracle et sql server.

Ce n'est pas le meilleur pour moi mais pratique pour un modèle simple (pas de gestion de dictionnaire de données etc).
Pour moi le meilleur reste poweramc.

@+
Il en faut peu pour être heureux ......