2016-04-26 2 views
-3

Ich habe einige Probleme mit einer Abfrage. Ich möchte Werte addieren, die nach dem letzten Wert in einer anderen Spalte für jede ID angezeigt werden.SQL - Abfrage, um Werte nach einem bestimmten Wert für jede ID summieren

Die Datenbank sieht wie folgt aus, aber ohne die Notizen neben den Zählwerte:

ID_____Date______Amount_____Count

8 ____ 2016.04.20 ____ 300________500 (seit der letzten Zählung)

8 ____ 2016.04.21 ____ 100________100 (Seit der letzten Zählung, nur 100 von dieser Linie)

8 ____ 2016-04-22 ____ 200________ 0

8 ____ 2016.04.23 ____ 300________0

8 ____ 2016.04.24 ____ 400________900 (seit dem letzten Zahl: 400 + 300 + 200)

8 ____ 2016.04.25 ____ ________0

112__2016 -04-20 ____ 100________0

112__2016-04-21 ____ 100________500 (Seit der letzten Zählung)

112__2016-04-22 ____ ________0

112__2016-04-23 ____ ________0

112__2016-04-24 ____ ________0

112__2016-04-25 ____ ________0

333__20 16-04-20 ____ 700________1000 (seit dem letzten Zählung)

333__2016-04-21 ____ 400________0

333__2016-04-22 ____ 200________0

333__2016-04-23 ____ 200________0

333__2016-04-24 ____ 200________0

333__2016-04-25 ____ 400________1400 * (Seit der letzten Zählung, 400 + 200 + 200 + 200 + 400)

Ich möchte die fett Werte summieren, da sie noch nicht zur Zählung hinzugefügt wurden. Keine Werte von ID 333, da sie in der letzten Zeile zählen.

Das Ergebnis der Abfrage sollte (400 + 200 + 200 + 200 + 300)

Es gibt über 150 verschiedene IDs in der realen Datenbank

Wäre Ihre Hilfe zu schätzen wissen :)

+1

400 + 300 + 200 <> 1000. –

Antwort

0

Zunächst einmal ist dies ein schlechtes Datenbankdesign. Sie halten doppelte Daten in Ihrer Datenbank (diese summierten Beträge sind bereits in der Datenbank, Sie müssen sie nur berechnen), was Ihnen noch weitere Kopfschmerzen bereiten wird. Befreien Sie sich von dieser Spalte und beseitigen Sie dieses Problem vollständig.

Das heißt, das sollten Sie geben, was Sie brauchen:

;WITH CTE_MaxDates AS 
(
    SELECT 
     id, 
     MAX([date]) AS max_date 
    FROM 
     My_Table 
    WHERE 
     [count] > 0 
    GROUP BY 
     id 
) 
SELECT 
    MT.id, 
    SUM(MT.amount) 
FROM 
    My_Table MT 
INNER JOIN CTE_MaxDates MD ON 
    MD.id = MT.id AND 
    MD.max_date < MT.[date] 
GROUP BY 
    MT.id 

Auch, wenn diejenigen tatsächlichen Spaltennamen sind, dann „Datum“ und „count“ für schlechte Spaltennamen machen, wie sie Wörter sind reserviert SQL Server und sie sind auch nicht sehr beschreibend.

+0

Zunächst einmal vielen Dank für Ihre Antwort, es hat super funktioniert! Und um die Datenbank zu erklären. Die Anzahl und Anzahl ist nicht immer gleich. Die Zählung ist die tatsächliche Menge, wenn von Hand gezählt wird. "Amount" ist das, was das System denkt. Sie werden in der realen Datenbank nicht als "Datum" und "Zählen" bezeichnet, es gibt also kein Problem :) Nochmals vielen Dank Tom! –

Verwandte Themen