範囲/グループ化テーブルを定義します。
次のようなものは、ほとんどの RDBMS で機能するはずです。
SELECT Grouping.id, SUM(Ingredient.ingredient_cost_amount) AS Ingredient_Cost_Amount,
SUM(Ingredient.cost_share_amount) AS Cost_Share_Amount
FROM (VALUES (2013, DATE('2013-01-01'), DATE('2014-01-01')),
(2012, DATE('2012-01-01'), DATE('2013-01-01'))) Grouping(id, gStart, gEnd)
JOIN Ingredient
ON Ingredient.date >= Grouping.gStart
AND Ingredient.date < Grouping.gEnd
GROUP BY Grouping.id
(DATE()
および関連する変換関数は DB に大きく依存しています。一部の RDBMS はVALUES
この方法の使用をサポートしていませんが、仮想グループ化テーブルを作成する他の方法があります)範囲に排他的な上限を使用した理由については、このブログ投稿
を
参照してください。
このように範囲テーブルを使用すると、データベースがインデックスを使用して集計を支援できる可能性があります。これがどれだけ役立つかは、使用されている特定の RDBMS など、他のさまざまな要因によって異なります。