SQL server: durchschnittliche Verkäufe mit datesbereichskriterien

Ich bin brandneu bei SQL server (wie 10 Minuten). Ich habe eine Testdatenbank, die ein paar Spalten enthält (Einheiten, date, Master ID, AVE Monatliche Verkäufe). Der durchschnittliche monatliche Umsatz ist leer.

background: Ich importiere data aus Excel-fileen, die fileen werden aus anderen fileen erstellt und die durchschnittliche Umsatzberechnungszeit ist Excel macht mich verrückt, also dieser Beitrag.

Was ich gerne machen möchte, bevölkert die durchschnittliche Verkaufsspalte mit den durchschnittlichen Einheiten für die letzten 6 Monate basierend auf dem date in der entsprechenden Zeile. dh wenn das date 2016-06-31 ist, sollte ich die durchschnittliche Einheitsverkäufe für die jeweilige Master-ID erhalten (Master-ID ist nicht mein eindeutiger Schlüssel – Fyi) vom 2016-01-01 bis einschließlich der 2016-06-31 .

Wie erwähnt bin ich neu bei SQL, ich benutze SQL server Express (lokal ausgeführt), die datatabelle ( SALES ) hat ca. 8m Zeilen. Ich bin mir nicht sicher, ob eine Berechnung wie diese getan werden sollte, ist SQL, aber ich würde gerne versuchen, damit ich überprüfen kann, ob es in jedem Fall schneller ist als mein aktueller Ansatz (Excel).

Es wäre toll, wenn man das mit einem Beispiel erklären kann.

Vielen Dank. Kennzeichen.

Ich gehe davon aus, dass Sie wollen, dass dies dynamische statt feste Werte ist (um data zu ändern und den korrekten Wert angezeigt zu lassen). Das folgende Beispiel zeigt, wie ich das in einer SELECT-Abfrage machen würde (ohne die zugrunde liegenden data zu ändern);

Testdaten (# = temporäre Tabelle)

 CREATE TABLE #TestTable (Units int, Date_Field datetime, Master_ID int) INSERT INTO #TestTable (Units, Date_Field, Master_ID) VALUES (10,'2016-07-06',1) ,(20,'2016-08-06',1) ,(30,'2016-09-06',1) ,(40,'2016-10-06',1) ,(50,'2016-11-06',1) ,(60,'2016-12-06',1) ,(70,'2016-10-06',2) ,(80,'2016-11-06',2) ,(90,'2016-12-06',2) 

Abfrage

 SELECT tt.Master_ID ,tt.Date_Field ,tt.Units ,SUM(tt2.Units) Sum_Units FROM #TestTable tt LEFT JOIN #TestTable tt2 ON tt2.Date_Field BETWEEN DATEADD(m,-3,tt.Date_Field) AND tt.Date_Field AND tt.Master_ID = tt2.Master_ID GROUP BY tt.Master_ID, tt.Date_Field, tt.Units ORDER BY tt.Master_ID, tt.Date_Field 

Ausgabe

 Master_ID Date_Field Units Sum_Units 1 2016-07-06 00:00:00.000 10 10 1 2016-08-06 00:00:00.000 20 30 1 2016-09-06 00:00:00.000 30 60 1 2016-10-06 00:00:00.000 40 90 1 2016-11-06 00:00:00.000 50 120 1 2016-12-06 00:00:00.000 60 150 2 2016-10-06 00:00:00.000 70 70 2 2016-11-06 00:00:00.000 80 150 2 2016-12-06 00:00:00.000 90 240 

Die Logik hier ist, dass Sie sich mit dem datesbereich als -3 Monate (für dieses Beispiel) wieder an denselben Tisch anschließen, um Ihre laufende Summe zu geben.

Es wird einfacher sein, dies zu tun, anstatt zu versuchen, die data in einer berechneten Spalte zu behalten (was wäre mein anderer Ansatz), wie Sie nur einmal einmal ausführen müssen, wenn Sie die data ziehen. Die berechnete Spalte muss jedes Mal, wenn Sie irgendwelche data in diese Tabelle setzen, berechnen.

Ersetzen Sie someuniquefield mit Ihrer Primärschlüsselspalte, testing Sie es auch nur mit der Auswahl zuerst.

 UPDATE t SET [AVE Monthly Sales] = x.avgsum FROM table t JOIN (SELECT someuniquefield , AVG(CASE WHEN date > DATEADD(m, -6, date - DATEPART(d, date) + 1) THEN Units END) OVER (ORDER BY Date DESC) avgsum FROM table ) as x ON x.someunqiuefield.=t.someuniquefield