Vous pouvez vérifier pour quels articles il existe un enregistrement chaque année. Vous pouvez le faire en vérifiant si le nombre d'années distinctes pour chaque élément est égal au total des années (en utilisant COUNT DISTINCT
):
number_years = params[:end_year].to_i - params[:start_year].to_i + 1
@sale_averages = Sale.joins(:shops, :items)
.select('items.name, AVG(sale.price) as price')
.where("EXTRACT(year from season_year) BETWEEN #{params[:start_year]} AND #{params[:end_year]}")
.where('shops.name': params[:select_shop])
.group('items.name')
.having("(COUNT(DISTINCT(EXTRACT(year from season_year))) = #{number_years})")
J'ai aussi utilisé BETWEEN
au lieu de <
et >
.Je pense que vous souhaitez regrouper par nom d'article au lieu de boutique (comme c'était le cas dans votre requête d'origine).