Sie können überprüfen, für welche Elemente es einen Datensatz für jedes Jahr gibt. Sie können dies tun, indem Sie überprüfen, ob die Anzahl der unterschiedlichen Jahre für jedes Element gleich der Gesamtzahl der Jahre ist (mithilfe von 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})")
Ich habe auch BETWEEN
verwendet statt <
und >
.Ich denke, Sie möchten nach Artikelnamen statt nach Shop gruppieren (wie es in Ihrer ursprünglichen Abfrage der Fall war).