我試圖在典型的餐廳類型數據庫上提供報告功能。我在下面描述了這個問題的具體情況,但簡而言之,我需要能夠檢索與自動加入「類別」表的項目有關的彙總數據(總和和計數)。我知道這很羅嗦,可能會讓人困惑,所以我會試着用一個例子來傳遞細節。我必須具體到這個問題的四個表:使用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