I'm trying to provide reporting functionality on a typical restaurant type database. I describe the specifics of the problem below, but in a nutshell I need to be able retrieve aggregate data (sums and counts) for items that relate to a heirarchical self-joining "Category" table. I know that's wordy and probably confusing, so I'll try to relay the details with an example. I have four tables specific to this problem:
Categories
Id Name ParentId
1 Food NULL
2 Drinks NULL
3 Beer 2
4 Draft Beer 3
5 Bottle Beer 4
6 Pizza 1
8 Sandwiches 1
ParentId is a FK back to Categories
MenuItems
Id Name CategoryId
1 6" Sausage 6
2 French Dip 8
3 Dogfish 60 IPA 4
4 Dogfish 60 IPA 5
5 Bud Light 5
Orders
Id Total DateReceived DateCompleted
1 12.00 1/1/1970 1:00 1/1/1970 1:05
2 11.50 1/1/1970 1:08 1/1/1970 1:18
OrderItems
Id Price OrderId MenuItemId
1 9.00 1 1
2 3.00 1 5
3 3.50 2 3
4 8.00 2 2
The goal of this reporting functionality is to take a categoryId and return a sum (or count) over a given period of time. If the incoming category is a leaf category (e.g. Bottle Beer), I have no problem calculating this total. If however it's higher up the heirarchy, "Food" for instance, I can't figure out how to write the query in such a way that it will sum up all child categories.
I'm using SQL Server 2008r2. I tried using a WITH common_table_expression query, but I got an error about aggregate functions not allowed in the "recursive part of a recursive cte".
The SQL I have today looks something like this:
SELECT SUM(oi.Price) as Total, DAY(o.Completed)
FROM Orders o
JOIN OrderItems oi on oi.orderId = o.id
JOIN MenuItems mi on oi.MenuItemId = mi.id
JOIN Categories c on mi.CategoryId = c.id
WHERE o.Completed is not null
AND c.Id = @categoryId
AND o.Completed between @startDate and @endDate
GROUP BY DAY(o.completed)
Again, if @categoryId is a leaf category, this query gives me exactly what I'm looking for. If it's not, it returns nothing. I'd like to be able to provide @category=2 (Drinks) and get back the sum of all items anywhere in the "Drinks" category hierarchy.
Thanks!