Nedsampla med hjälp av en kalendertabell
Ledningen uppskattade veckorapporten men ville se samtliga veckor under 2020, inte bara de veckor då bekvämligheter användes. Vi kan lösa det här med en kalendertabell: kalendertabellen innehåller alla veckor, så vi kan joina den med tabellen dbo.DaySpaVisit för att hitta svaren.
Ledningen vill också se den första dagen i varje kalendervecka, eftersom det ger viktig kontext för rapportens läsare.
Den här övningen är en del av kursen
Tidsserieanalys i SQL Server
Övningsinstruktioner
- Hitta och inkludera veckans nummer i kalenderåret.
- Inkludera det minsta värdet av
c.Datei varje grupp somFirstDateOfWeek. Det här fungerar eftersom vi grupperar efter vecka. - Joina tabellen
Calendarmed tabellenDaySpaVisitbaserat på kalendertabellens datum och varje dagsspabesökares besöksdatum.CustomerVisitStartär av typenDATETIME2och innehåller tid, vilket innebär att en direkt join bara inkluderar besök som startar exakt vid midnatt. - Gruppera efter kalenderveckans nummer.
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
SELECT
-- Determine the week of the calendar year
c.___,
-- Determine the earliest DATE in this group
-- This is NOT the DayOfWeek column
MIN(c.___) AS FirstDateOfWeek,
ISNULL(SUM(dsv.AmenityUseInMinutes), 0) AS AmenityUseInMinutes,
ISNULL(MAX(dsv.CustomerID), 0) AS HighestCustomerID,
COUNT(dsv.CustomerID) AS NumberOfAttendees
FROM dbo.Calendar c
LEFT OUTER JOIN dbo.DaySpaVisit dsv
-- Connect dbo.Calendar with dbo.DaySpaVisit
-- To join on CustomerVisitStart, we need to turn
-- it into a DATE type
ON c.Date = CAST(dsv.___ AS ___)
WHERE
c.CalendarYear = 2020
GROUP BY
-- When we use aggregation functions like SUM or COUNT,
-- we need to GROUP BY the non-aggregated columns
c.___
ORDER BY
c.CalendarWeekOfYear;