我试图在典型的餐厅类型数据库上提供报告功能。我在下面描述了这个问题的具体情况,但简而言之,我需要能够检索与自动加入“类别”表的项目有关的汇总数据(总和和计数)。我知道这很罗嗦,可能会让人困惑,所以我会试着用一个例子来传递细节。我必须具体到这个问题的四个表:使用SQL Server 2008r2中的自连接表来汇总数据
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并返回之和(或计数)在一段时间。如果传入的类别是一个叶子类别(例如瓶子啤酒),我没有计算这个总数的问题。但是,如果它的层次更高,例如“Food”,我就无法弄清楚如何编写查询,以便总结所有的子类别。
我正在使用SQL Server 2008r2。我尝试使用WITH common_table_expression查询,但我得到了关于“recursive 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(Drinks)并获取“Drinks”类别层次结构中任何位置的所有项目的总和。
谢谢!
太棒了!非常感谢。正是我在找什么。 – tobyb 2011-06-07 06:00:29