2017-07-02 4 views
0

ich die folgende SQL-Diagramm haben:Alle Kuchen kleiner als Gruppe durch Summe

Category: 
id_category 
category_name 

Measurement 
id_measurement 
name_measurement 

Ingredient 
id_ingredient 
name_ingredient 
category_id 
measurement_id 
nrOfCal 

IngredientCake 
id_ingredient 
cake_code 
quantities 

Cake 
cake_code 
cake_name 

Ich weiß nicht, wie die alle Code und Name Kuchen anzuzeigen, die weniger als 500 Kalorien haben. Was ich versucht habe:

select [Cake].cake_code , [Cake].cake_name 
from  [Cake] 
inner join [Ingredient_Cake] 
on   ([Cake].cake_code = [Ingredient_Cake].cake_code) 
inner join [Ingredient] 
on   ([Ingredient_Cake].id_ingredient = [Ingredient].id_ingredient) 
where  sum([Ingredient].nrOfCal) < 500 
group by [Cake].cake_code; 

aber trotzdem gibt es mir die Fehlermeldung:

An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference. 

Jede Lösung?

EDIT:

select  [Cake].cake_code, 
     [Cake].cake_name 
from  [Cake] 
inner join [Ingredient_Cake] 
on   ([Cake].cake_code = [Ingredient_Cake].cake_code) 
inner join [Ingredient] 
on   ([Ingredient_Cake].id_ingredient = [Ingredient].id_ingredient) 
group by [Cake].cake_code, [Cake].cake_name 
having  sum(nrOfCal*quantities) > 500; 

Ich habe bearbeitet und jetzt der lustige Teil ist, dass, wenn ich es so lassen, gibt sie mir, wie sollte es die Kuchen mit den Kalorien, weniger als 500, aber die Bedingung ist jetzt (> 500), und wenn ich die Bedingung zu < 500 ändere, gibt es mir nur den Kuchen zurück, der mehr als 500 Kalorien hat. Was ist los?

+0

versuchen, indem Sie es auf die 'haben'-Klausel – McNets

Antwort

0

Versuchen Sie das Aggregat auf die having-Klausel zu bewegen:

select  [Cake].cake_code, 
      [Cake].cake_name 
from  [Cake] 
inner join [Ingredient_Cake] 
on   ([Cake].cake_code = [Ingredient_Cake].cake_code) 
inner join [Ingredient] 
on   ([Ingredient_Cake].id_ingredient = [Ingredient].id_ingredient) 
group by [Cake].cake_code, [Cake].cake_name 
having  sum([Ingredient].nrOfCal) < 500; 
+0

verschieben Jetzt ist der Fehler weg, aber die SQL funktioniert nicht .. – IleNea

+0

Ich weiß nicht, Ihre Daten, vielleicht sollten Sie IngredientCake.quantities von nrOfCal multiplizieren? – McNets

+0

Ich bearbeitet und jetzt ist es seltsam. – IleNea

0

Da Ihr Zustand auf aggregierten Werten ist, müssen Sie HAVING Klausel verwenden (ausgeführt nach group by) statt where:

select [Cake].cake_code , [Cake].cake_name from [Cake] 
inner join [Ingredient_Cake] on ([Cake].cake_code = 
[Ingredient_Cake].cake_code) 
inner join [Ingredient] on ([Ingredient_Cake].id_ingredient 
= [Ingredient].id_ingredient) 
group by [Cake].cake_code 
Having sum([Ingredient].nrOfCal) < 500