Jag försöker summera antal besökare en site har haft veckovis men har kört fast.
ALTER PROCEDURE [dbo].[Stat_GetWeekUniqueVisitors]
@StartDate datetime = NULL,
@EndDate datetime = NULL
AS
BEGIN
SET NOCOUNT ON;
SET DATEFIRST 1;
SELECT SUM(CntVisitors) AS CntVisitors, YEAR(CurrentDate) AS CurrentYear, CurrentMonth=0,
CurrentWeek = DATEPART(WW,CurrentDate), CurrentDay=0
FROM vw_Stat_UniqueVisitors
WHERE (CurrentDate BETWEEN @StartDate AND @EndDate)
GROUP BY YEAR(CurrentDate), DATEPART(WW,CurrentDate)
ORDER BY YEAR(CurrentDate), DATEPART(WW,CurrentDate)
END
Jag får alltså 3 st vecka 53, 2007 samt 19 st v. 1, 2008 men detta är samma vecka så de borde mao. slås ihop! Går det att stuva om koden så att den summerar veckorna rätt?
Njae, så hade jag först men det håller tyvärr inte (eller?) eftersom att startdatum kan vara ex. 1:a veckan 2007 och slutdatum kan vara 3:e veckan 2008.
Det innebär att det finns 2 st vecka 1, både 2007 samt 2008 och dessa får inte slås ihop.
En snabb (ful) fix kan se ut så här:
ALTER PROCEDURE [dbo].[Stat_GetWeekUniqueVisitors]
@StartDate datetime = NULL,
@EndDate datetime = NULL
AS
BEGIN
SET NOCOUNT ON;
SET DATEFIRST 1;
WITH CTE_Weeks AS (
SELECT SUM(CntVisitors) AS CntVisitors,
CASE DATEPART(WW,CurrentDate) WHEN 53 THEN
YEAR(CurrentDate)+1
ELSE
YEAR(CurrentDate) END AS CurrentYear,
CurrentMonth=0,
CASE DATEPART(WW,CurrentDate) WHEN 53 THEN
1
ELSE
DATEPART(WW,CurrentDate) END AS CurrentWeek,
CurrentDay=0
FROM vw_Stat_UniqueVisitors
WHERE (CurrentDate BETWEEN @StartDate AND @EndDate)
GROUP BY YEAR(CurrentDate), DATEPART(WW,CurrentDate)
)
SELECT SUM(CntVisitors), CurrentYear, CurrentMonth, CurrentWeek, CurrentDay
FROM CTE_Weeks
GROUP BY CurrentYear, CurrentMonth, CurrentWeek, CurrentDay
ORDER BY CurrentYear, CurrentWeek
END
Jag vet inte om den kommer att funka på alla sorters datum men den funkar på ovanstående i alla fall! Men snyggt? Nää!
ALTER PROCEDURE [dbo].[Stat_GetWeekUniqueVisitors]
@StartDate datetime = NULL,
@EndDate datetime = NULL
AS
BEGIN
SET NOCOUNT ON;
SET DATEFIRST 1;
SELECT SUM(CntVisitors) AS CntVisitors, YEAR(CurrentDate) AS CurrentYear, CurrentMonth=0,
CurrentWeek = ISOWeek(CurrentDate), CurrentDay=0
FROM vw_Stat_UniqueVisitors
WHERE (CurrentDate BETWEEN @StartDate AND @EndDate)
GROUP BY YEAR(CurrentDate), ISOWeek(CurrentDate)
ORDER BY YEAR(CurrentDate), ISOWeek(CurrentDate)
END