2016-04-29 21 views
0

Wie berechne ich die kumulative Summe einer Spalte im Zeitverlauf, wenn viele der Spalten Nullwerte haben?MySQL: Kumulative Summe mit Nullzeilen berechnen

Ich versuche, die folgende ein, und meine Abfrage Timeout ohne Meldung spezifischen Fehler:

SELECT t1.time_purchased, 
    t1.savings AS daily_savings, 
    SUM(t2.savings) AS total_savings 
FROM items AS t1, 
    items AS t2 
WHERE t1.time_purchased >= t2.time_purchased 
GROUP BY t1.time_purchased; 

time_purchased und Spar Reihen sind oft leer - wird dies den Fehler verursacht? Wenn ja, was kann ich tun, um diese Fehler zu überspringen und trotzdem die Einsparungen zu den total_savings hinzuzufügen?

Idealerweise möchte ich die kumulativen Einsparungen im Laufe der Zeit zeigen, unabhängig von time_purchased. Vielen Dank!

SOLUTION EDIT:

Vielen Dank an alle für die dort Hilfe. Die endgültige Lösung erforderte, dass meine FROM-Anweisung aus einer Tabelle auswählte, in der die Einsparungen keine Nullwerte enthielten, andernfalls war cumulative_sum weiterhin null, weil ich in einigen Fällen einen Nullwert hinzufügte. Sehen Sie sich die Lösung unter:

SET @cumulative_sum := 0; 
SELECT 
    time_purchased 
    ,savings 
    ,(@cumulative_sum := @cumulative_sum + savings) AS cumulative_sum 
FROM (SELECT * FROM items WHERE savings IS NOT NULL) AS i 
ORDER BY time_purchased; 
+0

Es hat nichts mit den Nullwerten zu tun. Das Problem ist, dass das Kreuzprodukt sehr groß ist. – Barmar

+1

Hat diese Tabelle Einsparungen für jeden Kunden? Sie gruppieren nicht nach Kunden, so dass für jeden Kunden und jedes Datum eine Zeile angezeigt wird und die Gesamtsumme für * alle * anderen Kunden angezeigt wird. – Barmar

+0

Es hat keine Ersparnis für jeden Kunden - wie würdest du mir empfehlen zu gruppieren? – avtomate

Antwort

0

In MySQL, der einfachste Weg, um eine kumulative Summe zu tun Variablen verwenden:

SELECT i.time_purchased, 
     i.savings 
     (@ds := @ds + i.savings) AS total_savings 
FROM items i CROSS JOIN 
    (SELECT @ds := 0) params 
ORDER BY i.time_purchased; 

Ich bin nicht sicher, was Sie mit den NULL Werten tun möchten, aber zumindest sollte das nicht auslaufen.

+0

Hey, danke für deine Antwort. In der vierten Zeile - "SUM (t2.Savings) AS total_savings" - gibt es einen Tippfehler? Ich sehe, Sie beziehen sich auf t2.Savings (wenn t2 hier nicht existiert?) Und Alias ​​das Ergebnis als "total_savings", die bereits in der vorherigen Zeile Aliasing war? Warum wird eine select-Anweisung auch als params formatiert, aber params wird nie verwendet? Vielen Dank für Ihre Hilfe! – avtomate

+0

Ich habe es herausgefunden! Vielen Dank für Ihre Hilfe: ^) – avtomate

+0

@avtomate. . . Diese Linie war ein Tippfehler –