Afficher le Pourcentage de la valeur de mysql
J'ai le tableau de données suivant et de données:
mysql> describe school_data_sets_numeric_data;
+--------------+----------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| data_set_nid | int(11) | NO | | NULL | |
| school_nid | int(11) | NO | | NULL | |
| year | int(11) | NO | | NULL | |
| description | varchar(255) | NO | | NULL | |
| value | decimal(18,12) | NO | | NULL | |
+--------------+----------------+------+-----+---------+----------------+
6 rows in set (0.00 sec)
+----+--------------+------------+------+-------------------+------------------+
| id | data_set_nid | school_nid | year | description | value |
+----+--------------+------------+------+-------------------+------------------+
| 54 | 19951 | 19944 | 2008 | Asian | 75.000000000000 |
| 51 | 19951 | 19944 | 2008 | White | 200.000000000000 |
| 52 | 19951 | 19944 | 2008 | African American | 100.000000000000 |
| 53 | 19951 | 19944 | 2008 | Hispanic | 50.000000000000 |
| 55 | 19951 | 19944 | 2008 | Native American | 9.000000000000 |
Je veux afficher la moyenne des données au lieu de chiffres bruts. Je veux le faire en sql brut.
Exemple:
+----+--------------+------------+------+-------------------+------------------+
| id | data_set_nid | school_nid | year | description | average |
+----+--------------+------------+------+-------------------+------------------+
| 54 | 19951 | 19944 | 2008 | Asian | 17.28% |
| 51 | 19951 | 19944 | 2008 | White | 46.06% |
| 52 | 19951 | 19944 | 2008 | African American | 23.04% |
| 53 | 19951 | 19944 | 2008 | Hispanic | 11.52% |
| 55 | 19951 | 19944 | 2008 | Native American | 2.07% |
Quelle est la meilleure façon de le faire? Gardez à l'esprit, il y aura plusieurs ensembles de données et des années.
OriginalL'auteur Chris Muench | 2012-08-10
Vous devez vous connecter pour publier un commentaire.
Une façon de le faire est d'écrire une requête qui récupère la "valeur totale", qui sera le dénominateur pour votre moyenne.
Joindre les résultats de cette requête à chaque ligne de la table, de sorte que vous avez de la valeur et de total disponible, que vous pouvez utiliser pour calculer la moyenne.
Le mot-clé
CROSS
est facultatif, mais il sert à la documentation pour plus tard critiques, et leur permet de savoir que nous avons l'intention de créer un produit Cartésien, et que nous avons délibérément laissé de côté (et non pas accidentellement omis) unON
clause pour la REJOINDRE.L'expression qui renvoie à la "moyenne", affiche la valeur que vous la montrer... arrondi à deux décimales avec un trailing signe de pourcentage.
Le calcul de la "moyenne" est simple...
value /total_value * 100
.(Méfiez-vous de la "integer" division si le numérateur et le demoninator sont les types integer, pas un problème dans votre cas, mais nous nous assurons que le numérateur est le nombre décimal en multipliant par virgule littérale, qui s'assure que nous avons valeur de type decimal.)
Le reste de l'expression traite en évitant de possibles "division par zéro" exception, arrondi à deux décimales, la mise en forme fixe de deux décimales, et en ajoutant le '%'.
Si vous voulez que ces signes % pour la ligne, vous pouvez remplir le côté gauche de cette chaîne avec des espaces, à une longueur spécifique, par exemple
LPAD(expr,7,' ')
. (En fait, je serais probablement le faire avant la CONCAT qui ajoute de l'%", mais il n'a pas vraiment d'importance.)Si vous avez l'intention de faire une moyenne sur un sous-ensemble, par exemple, pour une année donnée, et plus particulièrement un jeu de données, au lieu de la totalité de retour ensemble, alors nous obtenons la "sous-total" pour chacun de ces groupes de données.
Ici, nous allons calculer la moyenne d'un particulier
data_set_nid
etyear
:OriginalL'auteur spencer7593
De l'essayer.
Entrée sera quelque chose comme ça
OriginalL'auteur jcho360
Essayez les solutions suivantes. Testé sur sqlfidlle.
OriginalL'auteur Florin Stingaciu