2017-10-03 5 views
0

Ich mag eine Erhöhung Wert für jeden Datensatz aus dieser Tabelle unten (table_values) zählen:Count kumulative/Zunahme für jeden id [MYSQL]

zum Beispiel
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  | 

So auszuwählen, in das Projekt = 20 Ergebnisse sollte sein:

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 | 

Wählen Sie sollten kumulative Ergebnisse für jede ID wenn möglich zurückgeben. Irgendwelche Vorschläge?

Grüße.

UPDATE: TABLE:

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

Ergebnis:

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

kleine Informationen für die Analyse – soft87

+0

Mein Vorschlag ist, dass Sie uns sagen, warum Sie dies tun möchten, auf welcher Art von Plattform, und vorzugsweise, was Sie bisher versucht haben. –

Antwort

1

Dieser Ansatz verwendet Parameter und sieht zu erreichen, was Sie beschrieben haben. Vielleicht möchten Sie die Namen ändern, wenn es, wie einige vielleicht etwas ungeeignet sind (wie sie reservierten Namen geschlossen sind)

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

Hinweis: Dieses Muster mit benutzerdefinierten Variablen hängt vom Verhalten ab, das nicht garantiert ist. Aus dem MySQL-Referenzhandbuch: "Als eine allgemeine Regel sollten Sie, anders als in SET-Anweisungen, niemals einer Benutzervariablen einen Wert zuweisen und den Wert innerhalb der gleichen Anweisung lesen .... Sie erhalten möglicherweise die erwarteten Ergebnisse, aber dies ist nicht garantiert. " Referenz: https://dev.mysql.com/doc/refman/5.7/en/user-variables.html – spencer7593

+0

Ich sehe das nicht als eine Sicherheitslücke in diesem Fall. Die Variable wird außerhalb der Operation, in der sie festgelegt ist, nicht "ausgewählt", so dass es kein Sortierproblem gibt. –

+0

Warum benutzen Sie 'group by' und' sum'? –

2

Sie die Zeilen mit allen bisherigen beitreten können (einschließlich der gleichen) Zeilen aus der selben Projekt und verwenden 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 

Demo: http://rextester.com/NZDN42998

Dies ist eine teure Abfrage (in Bezug auf die Leistung) - aber zumindest ist es zuverlässig.

+0

SIE sind erstaunlich :) –

Verwandte Themen