我希望仅获取某些年份之间商店中存在的销售记录。我将如何最好地执行此搜索?
例如,用户选择2013年的开始年份和2016年的结束年份以及商店名称。该商店选择出售香蕉和苹果,但该商店仅在2013年,2014年和2016年出售苹果。我希望我的结果仅显示香蕉的平均销售额,因为2015年未出售苹果。
到目前为止,我有以下查询:
@sale_averages = Sale.joins(:shops, :items).where('extract(year from season_year) < ? AND extract(year from season_year) > ? ', params[:start_year], params[:end_year])
.where('shops.name = ?', params[:select_shop])
.select('items.name, AVG(sale.price) as price').group('shop.name')
只是不确定如何创建一个查询,该查询仅过滤出所有搜索参数(年份和商店)中具有的项(或ID)。
架构
create_table "items", force: :cascade do |t|
t.string "name"
end
create_table "sales", force: :cascade do |t|
t.integer "shop_id"
t.integer "item_id"
t.date "season_year"
t.decimal "price"
end
create_table "shops", force: :cascade do |t|
t.string "name"
end
答案 0 :(得分:-1)
我这里没有安装postgres,因此可能需要进行一些更正,但是这里的基本思想(至少是我的基本思想)是生成年份列表,选择其中一个年份中的所有项目,然后进行比较计数:
WITH years AS (
SELECT * FROM generate_series(start_year,end_year);
)
SELECT years, COUNT(items.id) AS item_count
WHERE items.season_year IN years GROUP_BY(item.id)
HAVING COUNT(years) = item_count