Eu aş face toate calculele în Transact-SQL, de exemplu (în baza de date AdventureWorks):
DECLARE @StartDate datetime, @EndDate datetime
SET @StartDate='20031001'
SET @EndDate='20031231'
SELECT * FROM (
SELECT YEAR(OrderDate) AS YearNumber, MONTH(OrderDate) AS MonthNumber, DAY(OrderDate) AS DayNumber,
OrderDate, WeekDayName, CurrentSales, PreviousYearDate,
(SELECT SUM(TotalDue) FROM Sales.SalesOrderHeader WHERE OrderDate=PreviousYearDate) AS PreviousYearSales
FROM (
SELECT OrderDate, WeekDayName, CurrentSales,
DATEADD(DAY,(DATEPART(WEEKDAY,OrderDate)-DATEPART(WEEKDAY,DATEADD(YEAR,-1,OrderDate))+7)%7,DATEADD(YEAR,-1,OrderDate)) AS PreviousYearDate
FROM (
SELECT OrderDate, DATENAME(WEEKDAY,OrderDate) AS WeekDayName, SUM(TotalDue) AS CurrentSales
FROM Sales.SalesOrderHeader
WHERE OrderDate BETWEEN @StartDate AND @EndDate
GROUP BY OrderDate
) t1
) t2
UNION ALL
SELECT YearNumber, MonthNumber, NULL AS DayNumber, NULL AS OrderDate, NULL AS WeekDayName, CurrentSales, NULL AS PreviousYearDate,
(SELECT SUM(TotalDue) FROM Sales.SalesOrderHeader WHERE YEAR(OrderDate)=YearNumber-1 AND MONTH(OrderDate)=MonthNumber) AS PreviousYearSales
FROM (
SELECT YEAR(OrderDate) AS YearNumber, MONTH(OrderDate) AS MonthNumber, SUM(TotalDue) AS CurrentSales
FROM Sales.SalesOrderHeader
WHERE OrderDate BETWEEN @StartDate AND @EndDate
GROUP BY YEAR(OrderDate), MONTH(OrderDate)
) t3
) t4
ORDER BY YearNumber, MonthNumber, -DayNumber DESC
Răzvan