USE WideWorldImporters; GO SET STATISTICS IO ON; SELECT YEAR(OrderDate) SalesYear , DATEPART(q, OrderDate) SalesQuarter , MONTH(OrderDate) SalesMonth , SUM(ol1.UnitPrice * ol1.Quantity) MonthlySalesAmount , (SELECT SUM(ol2.UnitPrice * ol2.Quantity) FROM Sales.Orders o2 INNER JOIN Sales.OrderLines ol2 ON o2.OrderID = ol2.OrderID WHERE YEAR(o2.OrderDate) = YEAR(o1.OrderDate) AND DATEPART(q, o2.OrderDate) = DATEPART(q, o1.OrderDate)) AS QuarterlySalesAmount , (SELECT SUM(ol2.UnitPrice * ol2.Quantity) FROM Sales.Orders o2 INNER JOIN Sales.OrderLines ol2 ON o2.OrderID = ol2.OrderID WHERE YEAR(o2.OrderDate) = YEAR(o1.OrderDate) ) AS YearlySalesAmount FROM Sales.Orders o1 INNER JOIN Sales.OrderLines ol1 ON o1.OrderID = ol1.OrderID GROUP BY YEAR(OrderDate), DATEPART(q, OrderDate), MONTH(OrderDate) ORDER BY 1, 2, 3;
I cleaned up the cache with following code and executed query to see some satistics. It takes 4 seconds and it has read more than 14,000 pages from the Orders and more than 91,000 pages from the OrderLines table.
DBCC FREEPROCCACHE; DBCC DROPCLEANBUFFERS;
USE WideWorldImporters; GO SET STATISTICS IO ON; WITH YearlySales (SalesYear, YearlySalesAmount) AS ( SELECT YEAR(OrderDate), SUM(UnitPrice * Quantity) FROM Sales.Orders o INNER JOIN Sales.OrderLines ol ON o.OrderID = ol.OrderID GROUP BY YEAR(OrderDate) ), QuarterlySales (SalesYear, SalesQuarter, QuarterlySalesAmount) AS ( SELECT YEAR(OrderDate), DATEPART(q, OrderDate), SUM(UnitPrice * Quantity) FROM Sales.Orders o INNER JOIN Sales.OrderLines ol ON o.OrderID = ol.OrderID GROUP BY YEAR(OrderDate), DATEPART(q, OrderDate) ), MonthlySales (SalesYear, SalesQuarter, SalesMonth, MontlySalesAmount) AS ( SELECT YEAR(OrderDate), DATEPART(q, OrderDate), MONTH(OrderDate), SUM(UnitPrice * Quantity) FROM Sales.Orders o INNER JOIN Sales.OrderLines ol ON o.OrderID = ol.OrderID GROUP BY YEAR(OrderDate), DATEPART(q, OrderDate), MONTH(OrderDate) ) SELECT y.SalesYear, q.SalesQuarter, m.SalesMonth, m.MontlySalesAmount, q.QuarterlySalesAmount, y.YearlySalesAmount FROM YearlySales y INNER JOIN QuarterlySales q ON y.SalesYear = q.SalesYear INNER JOIN MonthlySales m ON q.SalesYear = m.SalesYear AND q.SalesQuarter = m.SalesQuarter ORDER BY y.SalesYear, q.SalesQuarter, m.SalesMonth;


