Удалить столбец из группы по - PullRequest
1 голос
/ 23 февраля 2020

Запрос, который я пытаюсь создать:

Найдите рецепт (ы), которые используют большинство гвоздик Гарли c. (1 столбец, 1 строка)

Моя проблема в том, что я должен включить Recipes.RecipeTitle в мое предложение Group By, иначе я получу ошибку. И всякий раз, когда я включаю его в Group By, мой запрос возвращает 4 результата вместо 1 (ростбиф).

Может кто-нибудь помочь объяснить, как переписать это так, чтобы мне, возможно, не понадобилось предложение Group By.

select distinct 
    Recipes.RecipeTitle
from 
    Recipes
inner join 
    Recipe_Ingredients on Recipes.RecipeID = Recipe_Ingredients.RecipeID
inner join 
    Ingredients on Recipe_Ingredients.IngredientID = Ingredients.IngredientID
group by 
    Recipe_Ingredients.Amount, Recipes.RecipeTitle
having 
    Recipe_Ingredients.Amount = max(Recipe_Ingredients.Amount)
    and Recipes.RecipeTitle IN (select Recipes.RecipeTitle
                                from Recipes
                                inner join Recipe_Ingredients on Recipes.RecipeID = Recipe_Ingredients.RecipeID
                                inner join Ingredients on Recipe_Ingredients.IngredientID = Ingredients.IngredientID
                                group by Recipes.RecipeTitle, Ingredients.IngredientName
                                having Ingredients.IngredientName in ('garlic'));

Диаграмма базы данных:

enter image description here

Также вот созданная мной скрипта БД

Ответы [ 2 ]

1 голос
/ 23 февраля 2020

Фильтр для чеснока c до агрегации . В конце концов, вы хотите, чтобы рецепты содержали некоторое количество чеснока c.

Во-вторых, для этого необходимо предположить, что измерения для чеснока c все одинаковые, поэтому вы можете просто использовать amount как мера.

Затем один из методов - использовать select top (1) или select top (1) with ties для получения результатов. Разница в том, что select top (1) всегда возвращает ровно одну строку, даже если несколько рецептов имеют одинаковое максимальное количество чеснока c.

Итак:

select top (1) with ties r.RecipeTitle
from Recipes r join
     Recipe_Ingredients ri
     on r.RecipeID = ri.RecipeID join
     Ingredients i
     on ri.IngredientID = i.IngredientID
where i.IngredientName = 'garlic'
group by r.RecipeID, r.RecipeTitle
order by sum(amount) desc;

Можно измерить чеснок c в разных единицах - например, "головы" против "гвоздики", поэтому вам может потребоваться принять во внимание единицу измерения:

select top (1) with ties r.RecipeTitle
from Recipes r join
     Recipe_Ingredients ri
     on r.RecipeID = ri.RecipeID join
     Ingredients i
     on ri.IngredientID = i.IngredientID join
     Measurements m
     on ri.measurementAmountID = m.measurementAmountID
where i.IngredientName = 'garlic' and
      i.MeasurementDescription = 'clove'
group by r.RecipeID, r.RecipeTitle
order by sum(amount) desc;
0 голосов
/ 23 февраля 2020

Вы можете объединять, сортировать и ограничивать:

select top (1) with ties r.RecipeTitle
from Recipes r
inner join Recipe_Ingredients ri on r.RecipeID = ri.RecipeID
inner join Ingredients i on ri.IngredientID = i.IngredientI
group by r.RecipeID, r.RecipeTitle
order by sum(case when i.IngredientName = 'garlic' then 1 else 0 end) desc 

Примечания:

  • Я использовал with ties, поэтому, если есть верхние связи, запрос возвращает их

  • псевдонимы таблицы делают запрос короче, чтобы записать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...