Чтобы помочь мне подготовиться к походам, я создаю базу данных, в которой могу выбрать рецепты, которые хочу приготовить, и распечатать список ингредиентов, которые мне нужно взять с собой. У меня есть следующий запрос и результаты:
SQL, сгенерированный Access:
SELECT tblRecipeIngredients.IngredientID, tblIngredients.Cooler, tblIngredients.Ingredient, tblIngredients.UnitOfMeasure, tblRecipeIngredients.Quantity, tblRecipes.Planned
FROM tblIngredients INNER JOIN (tblRecipes INNER JOIN tblRecipeIngredients ON tblRecipes.RecipeID = tblRecipeIngredients.RecipeID) ON tblIngredients.IngredientID = tblRecipeIngredients.IngredientID
WHERE (((tblRecipes.Planned)=True))
ORDER BY tblIngredients.Cooler, tblIngredients.Ingredient;
Все идет нормально. Однако, поскольку некоторые ингредиенты используются в нескольких рецептах, для них имеется несколько строк. Для них я хотел бы иметь одну строку с общим количеством этого ингредиента. Я пробовал множество комбинаций DISTINCT, SUM, GROUP BY и т. д., но что бы я ни пытался, я получаю сообщение об ошибке, сообщающее, что какой-то столбец не включен как «часть агрегатной функции».
Есть ли способ заставить мой запрос и/или VBA делать то, что я хочу?
Конечно, вы все еще не используете Access 2010 и больше не поддерживается Microsoft.
@Parfait: я добавил SQL. У меня Access 2010 работает нормально, независимо от того, поддерживает его MS или нет.
Пожалуйста, опубликуйте попытку запроса, которая вызывает ошибку, а не оригинальную, которая работает. Ваша потребность звучит как простой агрегированный запрос . Найдите этот тип SQL-запроса или даже выполните поиск по ошибке. Всегда исследуйте, прежде чем спрашивать.
Включите группировку в конструкции запроса. Оставьте все в «Группировать по», кроме Quantity
, где вы используете сумму. Сделанный.
@Андре: Спасибо!! Это именно то, что мне было нужно.
Вы суммируете, используя SUM(tblIngredients.Quantity)
, чтобы получить сумму количества ингредиента, а затем добавляете все остальные столбцы в предложении SELECT
в предложение GROUP BY
:
SELECT tblRecipeIngredients.IngredientID, tblIngredients.Cooler, tblIngredients.Ingredient, tblIngredients.UnitOfMeasure, SUM(tblRecipeIngredients.Quantity) as Quantity, tblRecipes.Planned
FROM tblIngredients INNER JOIN (tblRecipes INNER JOIN tblRecipeIngredients ON tblRecipes.RecipeID = tblRecipeIngredients.RecipeID) ON tblIngredients.IngredientID = tblRecipeIngredients.IngredientID
WHERE (((tblRecipes.Planned)=True))
GROUP BY tblRecipeIngredients.IngredientID, tblIngredients.Cooler, tblIngredients.Ingredient, tblIngredients.UnitOfMeasure, tblRecipes.Planned
ORDER BY tblIngredients.Cooler, tblIngredients.Ingredient;
Спасибо!! Благодаря этому и комментарию Андре к моему сообщению, после нескольких дней поисков у меня наконец-то появилось решение. Мне никогда не приходило в голову группировать по всему.
В этом вся хитрость запроса GROUP BY
. Каждый столбец в вашем SELECT либо должен быть обернут в агрегатную функцию (sum()
, max()
, avg()
и т. д.), ИЛИ он должен быть указан в вашем предложении GROUP BY
. В противном случае это просто выдаст ошибку. Это справедливо для каждой СУБД (кроме Mysql до версии 5.7.2, которая допускала такую ерунду).
Пожалуйста, покажите вашу попытку запроса. В Access измените представление «Дизайн» на представление SQL и скопируйте этот текст, чтобы вставить его сюда, в область с форматированием кода.