2017-10-03 3 views
0

Je voudrais compter une valeur d'augmentation pour chaque enregistrement de ce tableau ci-dessous (table_values):Nombre cumulé/augmentation pour chaque id [MYSQL]

id | open | closed | in_progress | project | 
    1 | 0 | 0  | 0   | 20  | 
    2 | 1 | 0  | 1   | 20  | 
    3 | 1 | 1  | 1   | 55  | 
    4 | 1 | 1  | 1   | 20  | 
    5 | 1 | 1  | 1   | 20  | 
    6 | 2 | 2  | 0   | 20  | 

Ainsi, par exemple pour sélectionner où projet = 20 résultats devrait être:

id | open | closed | in_progress | project | Total | 
1 | 0 | 0  | 0   | 20  | 0 | 
2 | 1 | 0  | 1   | 20  | 2 | 
4 | 2 | 1  | 2   | 20  | 3 | 
5 | 3 | 2  | 3   | 20  | 3 | 
6 | 5 | 4  | 3   | 20  | 4 | 

Select devrait retourner des résultats cumulatifs pour chaque identifiant si possible. Des suggestions?

Cordialement.

MISE À JOUR: TABLE:

id | open | 
    1 | 2 | 
    2 | 3 | 
    3 | 5 | 

Résultat:

id | open | cumulative_open 
    1 | 2 | 2 
    2 | 3 | 5 
    3 | 5 | 10 
+1

peu d'informations pour l'analyse – soft87

+0

Ma suggestion est que dites-nous pourquoi vous voulez faire cela, sur quel type de plate-forme, et de préférence ce que vous avez essayé jusqu'à présent. –

Répondre

1

Cette approche utilise des paramètres et cherche à obtenir ce que vous avez décrit. Vous pouvez modifier les noms, bien que, comme certains sont probablement un peu impropre (comme ils sont fermés aux noms réservés)

SET @open = 0; 
SET @closed = 0; 
SET @in_progress = 0; 
select 
id, 
(@open := @open + open) as open, 
(@closed := @closed + closed) as closed, 
(@in_progress := @in_progress + in_progress) as in_progress, 
project, 
(open + closed + in_progress) as Total 
FROM table_values 
where project = 20 
group by id; 
+1

note: ce modèle avec des variables définies par l'utilisateur dépend d'un comportement qui n'est pas garanti. A partir du manuel de référence de MySQL: "En règle générale, sauf dans les instructions SET, vous ne devez jamais attribuer une valeur à une variable utilisateur et lire la valeur dans la même instruction ... vous pourriez obtenir les résultats attendus, mais ceci n'est pas garanti. " Référence: https://dev.mysql.com/doc/refman/5.7/fr/user-variables.html – spencer7593

+0

Je ne vois pas cela comme une vulnérabilité dans cette instance. La variable n'est pas "sélectionnée" en dehors de l'opération dans laquelle elle est définie, donc il n'y a pas de problème de commande. –

+0

Pourquoi utilisez-vous 'group by' et' sum'? –

2

Vous pouvez joindre les rangs avec tous les précédents (y compris les mêmes) lignes de la même projet et utiliser SUM():

select t1.id, 
    sum(t2.open) as open, 
    sum(t2.closed) as closed, 
    sum(t2.in_progress) as in_progress, 
    t1.project, 
    t1.open + t1.closed + t1.in_progress as Total 
from table_values t1 
join table_values t2 
    on t2.project = t1.project 
    and t2.id <= t1.id 
where t1.project = 20 
group by t1.id 

Démo: http://rextester.com/NZDN42998

Ceci est une requête coûteuse (en termes de performance) - Mais au moins il est fiable.

+0

VOUS ÊTES ÉTONNANT :) –