典型的なレストラン タイプのデータベースでレポート機能を提供しようとしています。以下に問題の詳細を説明しますが、一言で言えば、階層型の自己結合「カテゴリ」テーブルに関連するアイテムの集計データ (合計とカウント) を取得できる必要があります。これは冗長でおそらく混乱を招くことはわかっているので、例を挙げて詳細を説明します。この問題に固有の 4 つのテーブルがあります。
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 (Drinks) を指定して、「Drinks」カテゴリ階層内のすべてのアイテムの合計を取得できるようにしたいと考えています。
ありがとう!