2010-12-14 31 views
0

J'ai une table comme ceci:Mise à jour avec un pourcentage caculation sur la même table

ItemID  PersonID Score  Percentage 
========================================== 
1    1  10   [ = 10/10+30 = 25%] 
1    2  30   [ = 30/10+30 = 75%] 
2    1  20   [ = 20/20+40 = 33%] 
2    2  40   [ = 40/20+40 = 67%] 

Les données sur « pourcentage » n'est pas entré, mais est calculée automatiquement à un certain intervalle de temps. Le calcul est Pourcentage = Score/Score total de l'ID d'article

Au lieu d'utiliser la méthode "SELECT-faire les maths-UPDATE", j'essaye d'écrire un seul SQL pour mettre à jour le "Pourcentage".

Ce que j'ai essayé est comme ceci:

UPDATE tb_temp AS t1 
    SET t1.Percentage = 
     CEIL(t1.Score/
      (SELECT SUM(t2.Score) FROM tb_temp AS t2 WHERE t2.ItemID = t1.ItemID) 
     ); 

Mais il ne fonctionne pas (Code d'erreur: 1093 Vous ne pouvez pas spécifier la table cible 't1' pour la mise à jour dans la clause FROM)..

Une idée?

+0

Avec 'CEIL()', vous obtiendrez '34%' et '67%' 'pour Itemid = 2'. – Danosaure

+0

thx pour rappeler .... Je voudrais utiliser ROUND() à la place. – LazNiko

Répondre

-1

essayer:

UPDATE tb_temp t1 
    JOIN (SELECT ItemId, SUM(t2.Score) TotalScore 
      FROM tb_temp 
      group by ItemId) t2 ON t2.ItemID = t1.ItemID 
    SET t1.Percentage = CEIL(t1.Score/t2.TotalScore) 
+0

ERREUR 1054 (42S22): Colonne inconnue 't2.Score' dans la 'liste des champs' – Danosaure

+0

En supposant que @Michael Pakhantsov voulait écrire: 'mettre à jour tb_temp t1 jointure interne (sélectionner tt.ItemID, sum (tt.Score) TotalScore de tb_temp tt group by tt.ItemId) t2 en utilisant (ItemID) set t1.Percentage = CEIL (t1.Score/t2.TotalScore * 100) '(en supposant que' pourcentage d'int'). – Danosaure

+0

@Danosaure: votre version modifiée fonctionne comme prévu ~ thx! – LazNiko

0
UPDATE tb_temp AS t1 
    SET t1.Percentage = 
     CEIL(t1.Score/
      (SELECT SUM(t2.Score) FROM tb_temp AS t2 left join tb_temp AS t3 on t2.ItemID = t3.ItemID) 
     ); 
+0

Avez-vous même essayé votre déclaration? – Danosaure

+0

@Danosaure corrigé –

+0

Et je répète ... Avez-vous essayé votre déclaration "corrigée"? – Danosaure