2017-01-18 1 views
0

le nom de la table est une donnée.Moyenne et compte avec les conditions - mysql

Colonnes - 'date', 'emplacement,' fp, 'TV'

Sous ce jour je vais avoir plusieurs dates différentes, mais chaque date a un certain nombre de lignes avec la même date. Même avec l'emplacement.

Je suis en train de travailler sur la moyenne de TV pour chaque fois que la date et le lieu sont les mêmes et fp = 1, et insérer le résultat dans une nouvelle colonne appelée avgdiff

Je pourrais avoir un certain nombre de lignes avec la date 2016-12-08 et l'emplacement LA, avec des numéros différents sous FP et TV. Ainsi, lorsque la date est le 2016-12-08 et que la localisation est LA, fp pourrait être égal à 1, 4 fois, et la TV pour ces 4 lignes pourrait être de 7,4, 8,2, 1, -2. Donc le moy sera de 3.65.

Je pense que je dois utiliser les fonctions avg et count avec des conditions mais j'ai beaucoup de problèmes avec ça. J'espère que cela a du sens.

Merci

+0

Il est généralement une mauvaise idée de nouvelle colonne pour les données qui peuvent être calculées à la volée. Cela n'a aucun sens de stocker des données agrégées dans la même table. – shmosel

+1

s'il vous plaît fournir un meilleur exemple – hering

+0

'data' est un nom de table complètement vide de sens. – shmosel

Répondre

0

Vous pouvez interroger pour la moyenne en utilisant un GROUP BY:

SELECT `date`, `location`, AVG(`TV`) AS `avgtv` 
    FROM `data` 
WHERE `fp` = 1 
GROUP BY `date`, `location` 

Pour mettre à jour une autre table avec vos moyennes calculées (que je recommande fortement contre), vous pouvez utiliser un UPDATE...JOIN au-dessus en tant que sous-requête:

UPDATE ratings r 
    JOIN (/* paste above query here */) t 
    ON t.date = r.date AND t.location = r.location 
    SET r.avgtv = t.avgtv 
+0

Merci, ça marche. Mais la raison pour laquelle je veux stocker ces données dans la table est que je peux utiliser cette réponse dans une autre requête. Évidemment ce n'est pas le meilleur moyen mais je viens de commencer à apprendre cela, et cela a rendu les choses plus faciles jusqu'ici – accord

+0

@accord Vous pouvez toujours l'utiliser dans une autre requête. Si vous le stockez dans une autre colonne du même tableau, vous devrez dupliquer la moyenne de chaque ligne d'un groupe. C'est une conception de table terrible. – shmosel

+0

Oui, il n'y a aucune raison pour moi de stocker dans la même table. J'ai créé une autre table appelée «évaluations», et fait une colonne avgtv. Comment procéder pour stocker la requête ci-dessus dans la table de classement? – accord

0

Si, pour une raison quelconque, vous ne pouvez pas éviter de stocker des données agrégées dans le même tableau (int int roducing redondance et peut-être incorrect/pas aux valeurs de date), faire une déclaration de mise à jour de la forme suivante:

update data, 
    (select t2.location, t2.date, avg(t2.TV) as avgTV2 
    from data t2 
    where t2.fp = 1 
    group by t2.location, t2.date) aggValues 
set avgTV = avgTV2 
where data.location = aggValues.location 
    and data.date = aggValues.date 
    and data.fp = 1 
+0

Merci pour votre réponse. Cela fonctionne aussi bien, mais comme vous et Shmosel l'ont dit, il n'y a aucune raison pour moi de stocker dans la même table. Il faut donc commencer à apprendre à stocker les requêtes dans une autre table – accord