我正在尝试在典型的餐厅类型数据库上提供报告功能。我在下面描述了问题的细节,但简而言之,我需要能够检索与分层自连接“类别”表相关的项目的聚合数据(总和和计数)。我知道这很冗长而且可能令人困惑,所以我将尝试用一个例子来传达细节。我有四个针对此问题的表:
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 是返回类别的 FK
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
此报告功能的目标是获取 categoryId 并返回给定时间段内的总和(或计数)。如果传入的类别是叶类别(例如瓶啤酒),我计算这个总数没有问题。但是,如果它的层次结构更高,例如“食物”,我无法弄清楚如何编写查询以总结所有子类别。
我正在使用 SQL Server 2008r2。我尝试使用 WITH common_table_expression 查询,但出现“递归 cte 的递归部分”中不允许聚合函数的错误。
我今天的 SQL 看起来像这样:
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)
同样,如果 @categoryId 是叶类别,则此查询将准确地提供我正在寻找的内容。如果不是,则不返回任何内容。我希望能够提供@category=2(饮料)并取回“饮料”类别层次结构中任何位置的所有项目的总和。
谢谢!