Ich versuche eine Anfrage zu schreiben, bei der ich die Anzahl der Besuche für einen Kunden berechnen muss, indem ich auf überlappende Tage achte. Angenommen, für itemID 2009 ist das Startdatum der 23. und das Enddatum der 26. Tag. Daher wird bei item 20010 zwischen diesen Tagen das Kaufdatum nicht zu unserer Gesamtzahl hinzugefügt.
Beispielszenario:
Item ID Start Date End Date Number of days Number of days Candidate for visit count
20009 2015-01-23 2015-01-26 4 4
20010 2015-01-24 2015-01-24 1 0
20011 2015-01-23 2015-01-26 4 0
20012 2015-01-23 2015-01-27 5 1
20013 2015-01-23 2015-01-27 5 0
20014 2015-01-29 2015-01-30 2 2
OutPut sollte 7 VisitDays sein
Eingabetabelle:
CREATE TABLE #Items
(
CustID INT,
ItemID INT,
StartDate DATETIME,
EndDate DATETIME
)
INSERT INTO #Items
SELECT 11205, 20009, '2015-01-23', '2015-01-26'
UNION ALL
SELECT 11205, 20010, '2015-01-24', '2015-01-24'
UNION ALL
SELECT 11205, 20011, '2015-01-23', '2015-01-26'
UNION ALL
SELECT 11205, 20012, '2015-01-23', '2015-01-27'
UNION ALL
SELECT 11205, 20012, '2015-01-23', '2015-01-27'
UNION ALL
SELECT 11205, 20012, '2015-01-28', '2015-01-29'
Ich habe bisher versucht:
CREATE TABLE #VisitsTable
(
StartDate DATETIME,
EndDate DATETIME
)
INSERT INTO #VisitsTable
SELECT DISTINCT
StartDate,
EndDate
FROM #Items items
WHERE CustID = 11205
ORDER BY StartDate ASC
IF EXISTS (SELECT TOP 1 1 FROM #VisitsTable)
BEGIN
SELECT ISNULL(SUM(VisitDays),1)
FROM ( SELECT DISTINCT
abc.StartDate,
abc.EndDate,
DATEDIFF(DD, abc.StartDate, abc.EndDate) + 1 VisitDays
FROM #VisitsTable abc
INNER JOIN #VisitsTable bc ON bc.StartDate NOT BETWEEN abc.StartDate AND abc.EndDate
) Visits
END
--DROP TABLE #Items
--DROP TABLE #VisitsTable
Ich denke, das wäre mit einer Kalendertabelle einfach, zB so etwas:
Prüfstand
quelle