2016-08-01 51 views
0

Sagen wir einige Daten wieExcel laufende Gesamt/Fensterfunktion

gefolgt
Datetime    Type Sale 
25/07/2016 03:21  A  12 
25/07/2016 04:00  B  23 
25/07/2016 15:20  B  5 
26/07/2016 05:15  A  15 
26/07/2016 10:20  A  3 
26/07/2016 16:10  B  20 
27/07/2016 10:10  B  5 

....... 

Frage ist „um den Rahmen 36-Stunden-Suche, wo wir den größten Gesamtumsatz von Typ-A-Produkt“ mit Excel.

Von dem, was ich verstehe, und wenn ich versuche, es zu nähern, würde der 36-Stunden-Rahmen für jeden Eintrag bedeuten, dass wir von diesem Punkt an den Rahmen betrachten werden. Nehmen wir zum Beispiel den ersten Eintrag, der Rahmen, der damit beginnt, wäre 25/07/2016 03:21 -> 26/07/2016 15:21, 1,5 Tage später, was bedeutet, dass die Summe für diesen Rahmen 12 + 15 + 3 ist . Nimmt man später oder früher als der betrachtete Eintrag an, würde die Summe sinken, oder? Indem Sie jeden Eintrag als Ausgangspunkt nehmen, "spannt sich Ihre Summe am weitesten".

  1. Es sieht aus wie eine gefensterte Summe in SQL für mich. Wie würden Sie eine Lösung nur mit Excel finden?

  2. Es wäre schön, wenn Sie auch eine Lösung in SQL bereitstellen können.

Vielen Dank.

+0

Können Sie bitte die erwartete Ausgabe einfügen ..Für Excel läuft insgesamt, überprüfen Sie diese https://support.office.com/en-us/article/Calculate-a-running-total-170fa72a-a0f4-4476-9708 -5a9f993668e9 – TheGameiswar

+0

Ich habe weder den ursprünglichen Eingang noch den Ausgang. Es war eine Testfrage. Was wäre Ihr Ansatz, unabhängig von der realen Eingabe? – Kenny

Antwort

1

Sie müssen viel detaillierter angeben, wie Ihr 36-Stunden-Fenster funktioniert; ist es nur irgendein beliebiges 26-Stunden-Fenster oder sind es Intervalle mit definierten Start- und Endpunkten? Wenn es Letzteres ist, können Sie dies nur mit einer zusätzlichen Datetime Periods-Tabelle tun, für die Sie die Summen berechnen können.

Für den ehemaligen können Sie jedoch die 36-Stunden-Periode vor und nach jedem Verkauf betrachten und dann die maximale dieser Werte finden. Der einfachste Weg dazu ist ein Table in Excel und die folgenden SUMIFS Formeln, die für alle Verkäufe des gleichen Typs wie in der Zeile suchen, die einen Datetime-Wert 36 Stunden (1,5 Tage) vor oder nach dem Datetime-Wert in haben die gegebene Reihe:

starten, indem Sie Daten auswählen und einfügen dann eine Tabelle:

enter image description here

dann zwei Spalten hinzufügen und die folgenden Formeln eingeben:

Prev 36 Stunden:
= SUMIFS ([Verkauf], [Typ], [@ Typ], [Datetime] ">" & [@Datetime] -1,5 [Datetime] "< =" & [@Datetime])

Nächste 36 Stunden:
= SUMIFS ([Verkauf], [Typ], [@ Typ], [Datetime] "< "& [@Datetime] +1,5 [Datetime],"> =" & [ @Datetime])

enter image description here

diese 36 Stunden Perioden vom Datetim Verwendung in SQL Dazu Als Wert können Sie Folgendes verwenden. Ich habe sowohl die vorherigen als auch die folgenden 36-Stunden-Zeiträume einbezogen, da durch den Blick in nur eine Richtung der Verkauf entweder am Anfang oder am Ende des Datensatzes ausfällt.Windowed Funktionen lassen Sie nicht datengesteuerten Fenster angeben, damit Sie verwenden müssen entweder beitritt oder Unter wählt zu erreichen, was Sie nach:

declare @data table(dt Datetime, Type nvarchar(50), Sale int) 
insert into @data 
values 
('2016/07/25 03:21','A',12) 
,('2016/07/25 04:00','B',23) 
,('2016/07/25 15:20','B',5) 
,('2016/07/26 05:15','A',15) 
,('2016/07/26 10:20','A',3) 
,('2016/07/26 16:10','B',20) 
,('2016/07/27 10:10','B',5) 

select a.dt 
     ,a.Type 
     ,a.Sale 
     ,sum(dprev.Sale) as PrevSales 
     ,a.NextSales 
from(
    -- If you only want the proceeding 36 hour period you can just use this part -- 
    select d.dt 
      ,d.Type 
      ,d.Sale 
      ,sum(dnext.Sale) as NextSales 
    from @data d 
     left join @data dnext 
      on(d.Type = dnext.Type 
       and dnext.dt between d.dt and dateadd(hour,+36,d.dt) 
       ) 
    group by d.dt 
      ,d.Type 
      ,d.Sale 
    ------------------------------------------------------------------------------- 
) a 
    left join @data dprev 
     on(a.Type = dprev.Type 
      and dprev.dt between dateadd(hour,-36,a.dt) and a.dt 
      ) 
group by a.dt 
     ,a.Type 
     ,a.Sale 
     ,a.NextSales 
order by a.Type 
     ,a.dt 
+0

Das ist ein wichtiger Punkt der Frage, die ich vermute. Siehe meine aktualisierte Frage. Wenn Sie eine beliebige 36-h definieren, haben Sie keine optimale Summe. Der 36-h sollte bei jedem Eintrag beginnen, um "den weitesten zu spannen". – Kenny

+0

@Kenny Bearbeitete Antwort, um die Definition der 36-Stunden-Periode widerzuspiegeln. – iamdave

1

Schreib in E2 mit der Formel unten
=SUMIFS($C$2:$C$8,$B$2:$B$8,"=A",$A$2:$A$8,">="&A2,$A$2:$A$8,"<"&A2+1.5)

enter image description here