这个问题在这里已有答案:
如果某些年份之间存在于商店,我只想抓住销售记录。我如何才能最好地实施此搜索?
例如,用户选择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
我这里没有安装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