Ich verwende SQL Server 2012, um rollierende Verkaufsinformationen für Handelsagenten zu extrahieren. Diese Agenten erhalten Boni, wenn sie innerhalb einer rollierenden Zeitspanne von 6 oder weniger Tagen 15 Verkäufe erzielen. Wenn sie ein Ziel setzen, wird der Rollzähler zurückgesetzt. Sonntags sollte ignoriert werden.Verkaufsziele mit laufenden Summen mit Zurücksetzungen SQL Server 2012
So angesichts der folgenden AgentID, Datum und Daten Umsatz:
SELECT 1 AgentID,'2016-10-31' Date,1 Sales
INTO #Sales
UNION SELECT 1,'2016-11-01',2
UNION SELECT 1,'2016-11-02',1
UNION SELECT 1,'2016-11-03',5
UNION SELECT 1,'2016-11-04',3
UNION SELECT 1,'2016-11-05',2
UNION SELECT 1,'2016-11-07',6
UNION SELECT 1,'2016-11-08',5
UNION SELECT 1,'2016-11-09',4
UNION SELECT 1,'2016-11-10',6
UNION SELECT 1,'2016-11-11',1
UNION SELECT 1,'2016-11-12',3
UNION SELECT 1,'2016-11-14',2
UNION SELECT 1,'2016-11-15',2
UNION SELECT 1,'2016-11-16',4
UNION SELECT 1,'2016-11-17',2
UNION SELECT 1,'2016-11-18',2
die Daten, die ich das Ziel erwarten sind getroffen werden:
2016-11-07 (period 2016-11-01 -> 2016-11-07)
2016-11-10 (period 2016-11-08 -> 2016-11-10)
2016-11-18 (period 2016-11-12 -> 2016-11-18)
AgentID Date Sales Qualify
-------------------------------
1 2016-10-31 1 0
1 2016-11-01 2 0
1 2016-11-02 1 0
1 2016-11-03 5 0
1 2016-11-04 3 0
1 2016-11-05 2 0
1 2016-11-07 6 1
1 2016-11-08 5 0
1 2016-11-09 4 0
1 2016-11-10 6 1
1 2016-11-11 1 0
1 2016-11-12 3 0
1 2016-11-14 2 0
1 2016-11-15 2 0
1 2016-11-16 4 0
1 2016-11-17 2 0
1 2016-11-18 2 1
ich ein paar Ansätze ausprobiert habe, aber ich kann keine Möglichkeit finden, die Rollsummen zurückzusetzen.
Ich denke, dass Fensterfunktionen sind der Weg zu gehen.
auf Beiträge der Suche wie Window Functions - Running Total with reset
ich denke, das ähnlich ist, was ich brauche, kann aber nicht ganz bekommen es richtig zu arbeiten.
UPDATE: Das erste, was ich ausprobiert habe, war rollende 6-Tage-Fenster zu erstellen, aber ich sehe nicht, dass dies in einem Set-basierten Ansatz funktioniert. Ich könnte einen Cursor verwenden, um durch diese Zeilen zu gehen, aber ich mag die Idee wirklich nicht.
SELECT DATEADD(DAY,-6,a.Date) StartDate,Date EndDate,a.AgentID,a.Sales,
(SELECT SUM(b.Sales)
FROM cteSales b
WHERE b.Date <= a.Date
AND b.Date >= DATEADD(DAY,-6,a.Date)) TotalSales
FROM cteSales a
Ich habe dann versucht, das Skript in der URL erwähnt zu verwenden oben, aber ich verstehe nicht wirklich, was es tut. Ich ändere nur Dinge in der Hoffnung, über die Lösung zu stolpern und das funktioniert einfach nicht.
WITH c1 as
(
select *,
sum(sales) over(order by IDDate rows unbounded preceding) as rt
from cteSales
)
SELECT date, sales, rt,
SalesTarget_rt - lag(SalesTarget_rt, 1, 0) over(order by date) as SalesTarget,
rt * SalesTarget_rt as new_rt
from c1
cross apply(values(case when rt >= 15 then 1 else 0 end)) as a1(SalesTarget_rt);
haben Sie die Skripte, die Sie bisher versucht haben? – iamdave
Werden die Verkäufe nach 15 am selben Tag auch auf das nächste Ziel angerechnet? Also, wenn sie 14 am Tag 1 und dann 3 am Tag 2 verkauften, beginnt die Zählung für das nächste Ziel am Tag 3 bei 2 oder 0? – iamdave
Oh und auch (!) Gibt es immer nur einen Rekord pro Tag für jeden Agenten? – iamdave