The error is because fName
is included in the SELECT
list, but is not included in a GROUP BY
clause and is not part of an aggregate function (Count()
, Min()
, Max()
, Sum()
, etc.)
You can fix that problem by including fName
in a GROUP BY
. But then you will face the same issue with surname
. So put both in the GROUP BY
:
SELECT
fName,
surname,
Count(*) AS num_rows
FROM
author
INNER JOIN book
ON author.aID = book.authorID;
GROUP BY
fName,
surname
Note I used Count(*)
where you wanted SUM(orders.quantity)
. However, orders
isn’t included in the FROM
section of your query, so you must include it before you can Sum()
one of its fields.
If you have Access available, build the query in the query designer. It can help you understand what features are possible and apply the correct Access SQL syntax.
Не получается рассчитать стоимость с учетом скидки
SELECT зТоварный_чек.[Номер товарного чека],
зТоварный_чек.[Дата продажи], Sum(зТоварный_чек.Сумма) AS Стоимость,
IIf(Sum([Сумма])>2000,Sum([Сумма])*0.05,0) AS [Сумма скидки],
[Сумма]-(IIf(Sum([Сумма])>2000,Sum([Сумма])*0.05,0)) AS [Стоимость с учетом скидки]
FROM зТоварный_чек
GROUP BY зТоварный_чек.[Номер товарного чека], зТоварный_чек.[Дата продажи];
задан 12 ноя 2022 в 16:02
0
[Сумма]-(IIf(Sum([Сумма])>2000,Sum([Сумма])*0.05,0)) AS [Стоимость с учетом скидки]
^^^^^^^ этого поля нет в group by и оно не аггрегировано
[Сумма]
отсутствует в group by
, вы не можете её использовать в выборке. Вот Sum([Сумма]
— можете, потому что это аггрегирование по всей группе.
Если вы хотите получить стоимость с учётом скидки именно по всему чеку, то просто поставьте Sum
там где вы её пропустили, и всё:
Sum([Сумма])-(IIf(Sum([Сумма])>2000,Sum([Сумма])*0.05,0)) AS [Стоимость с учетом скидки]
^^^ - вот тут пропущено было Sum
ответ дан 12 ноя 2022 в 16:57
CrazyElfCrazyElf
65.5k5 золотых знаков19 серебряных знаков50 бронзовых знаков
1
The_Immortal 1569 / 505 / 48 Регистрация: 04.04.2009 Сообщений: 1,891 |
||||
1 |
||||
Часть агрегатной функции. Ошибка28.12.2012, 23:25. Показов 47792. Ответов 6 Метки нет (Все метки)
Ребят, подскажите, пожалуйста, что не так в данном выражении:
Акцесс ругается на конструкцию «Товар.Цена * 2» — но какое оно отношение имеет к функции MAX?
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
28.12.2012, 23:25 |
6 |
mobile 26784 / 14463 / 3192 Регистрация: 28.04.2012 Сообщений: 15,782 |
||||
28.12.2012, 23:41 |
2 |
|||
Ребят, подскажите, пожалуйста, что не так в данном выражении:
Акцесс ругается на конструкцию «Товар.Цена * 2» — но какое оно отношение имеет к функции MAX? Раз есть агрегатная функция и поле без нее, то должна быть группировка по полю без функции. Либо все поля в агрегатах
1 |
The_Immortal 1569 / 505 / 48 Регистрация: 04.04.2009 Сообщений: 1,891 |
||||
28.12.2012, 23:46 [ТС] |
3 |
|||
mobile,
Раз есть агрегатная функция и поле без нее, то должна быть группировка по полю без функции Вот так:
? Тоже самое…
0 |
26784 / 14463 / 3192 Регистрация: 28.04.2012 Сообщений: 15,782 |
|
29.12.2012, 00:12 |
4 |
The_Immortal, группировать можно по полю. Но не по его алиасу, поскольку при компиляции алиас поля может быть еще неизвестен. Поэтому групп бай должен быть по Товар.Цена, а не по его алиасу SUM.
1 |
Kotinho7 0 / 0 / 0 Регистрация: 18.10.2018 Сообщений: 2 |
||||
14.04.2020, 21:58 |
5 |
|||
mobile,
Подскажите, что не так в этом запросе? ругается на поле Собаки.Порода, пишет, что запрос не содержит это выражение как часть агрегатной функции.
0 |
mobile 26784 / 14463 / 3192 Регистрация: 28.04.2012 Сообщений: 15,782 |
||||||||
14.04.2020, 22:14 |
6 |
|||||||
Подскажите, что не так в этом запросе? ругается на поле Собаки.Порода, пишет, что запрос не содержит это выражение как часть агрегатной функции. Пишет абсолютную правду. В запросах с группировками, а перекрестный запрос обязательно группирующий, все поля не под агрегатными функциями должны быть перечислены в предложении GROUP BY. А у Вас только Собаки.Кличка d GROUP BY. Породы нет. Надо вставить
В условии WHERE изменил Like на равенство. Если нет подстановочных знаков, то требуется только полное значение. И зачем тогда лайк? Не нужен. Это если хотите искать только по части слова, тогда Like:
0 |
0 / 0 / 0 Регистрация: 18.10.2018 Сообщений: 2 |
|
14.04.2020, 22:21 |
7 |
В условии WHERE изменил Like на равенство. Если нет подстановочных знаков, то требуется только полное значение. И зачем тогда лайк? Не нужен. Это если хотите искать только по части слова, тогда Like: В таком случае пишет: выражение неверно введено или слишком сложное для расчетов. Заменил на лайк, заработало, но ввожу параметр, а в результате запроса ни одной записи не выводит.
0 |
Вот сам «правильный» запрос, с group by.
SELECT
order_id,
SUM(price * amount) AS order_price
FROM
positions
JOIN products ON products.id = positions.product_id
GROUP BY
positions.order_id
Но если сделать так:
SELECT
order_id,
SUM(price * amount) AS order_price
FROM
positions
JOIN products ON products.id = positions.product_id
Выходит ошибка:
SQL Error [42803]: ОШИБКА: столбец "positions.order_id" должен фигурировать в предложении GROUP BY или использоваться в агрегатной функции
Позиция: 11
Позиция ошибки: line: 2 pos: 10
-
Вопрос задан12 апр.
-
227 просмотров
Потому что это азы SQL: если в выражении есть и агрегирующая функция, и просто неагрегируемые значения, то необходимо явным образом указать, что нужно по ним группировать.
При использовании функций агрегации (например, SUM) в запросе и одновременном указании полей, которые не являются частью функций агрегации (например, positions.order_id), необходимо указывать эти поля в GROUP BY.
Пригласить эксперта
Вы не указали GROUP BY, но использовали агрегирующую функцию SUM. Такая комбинация эквивалентна агрегации всей выборки в одну строку. Однако, вы выбираете поле order_id. У СУБД возникает вопрос — а из какой именно строки брать значение этого поля в итоговую выборку? Скажем, после фильтрации осталось 10 строк с разными order_id. Какое именно из этих 10 значений вы хотите увидеть после агрегации?
-
Показать ещё
Загружается…
13 июн. 2023, в 18:39
5000 руб./за проект
13 июн. 2023, в 18:22
180000 руб./за проект
13 июн. 2023, в 18:21
2000 руб./в час
Минуточку внимания
Почему я не могу выполнить агрегатную функцию для выражения, содержащего агрегат, но я могу сделать это, создав вокруг него новый оператор выбора?
Почему в SQL Server я не могу этого сделать:
select sum(count(id)) as 'count'
from table
Но я могу сделать
select sum(x.count)
from
(
select count(id) as 'count'
from table
) x
Разве это не одно и то же? Как я должен думать об этом, чтобы понять, почему первый блок кода не разрешен?
person
Michael A
schedule
25.05.2012
source
источник
Ответы (7)
SUM () в вашем примере не работает — SUM () из COUNT () означает то же самое, что и просто COUNT (). Таким образом, ни один из ваших примеров запросов, похоже, не дает ничего полезного.
Мне кажется, что вложение агрегатов будет иметь смысл только в том случае, если вы захотите применить два разных агрегирования, то есть GROUP BY для разных наборов столбцов. Чтобы указать две разные агрегации, вам нужно будет использовать функцию GROUPING SETS или функцию SUM () OVER. Может быть, если вы объясните, чего хотите достичь, кто-то покажет вам, как это сделать.
person
nvogel
schedule
25.05.2012
Суть проблемы в том, что не существует такого понятия, как агрегирование агрегата, применяемого к отношению, см. Агрегация. Наличие такой концепции оставило бы слишком много дыр в определении и сделало бы предложение GROUP BY невозможным для выражения: ему необходимо определить как внутреннее агрегатное предложение GROUP BY , так и внешнее агрегатное выражение! Это относится также к другим совокупным атрибутам, таким как предложение HAVING.
Однако результатом применения агрегата к отношению является другое отношение, и это отношение результата, в свою очередь, может поддерживать новый оператор агрегирования. Это объясняет, почему вы можете объединить результат во внешний SELECT. Это не оставляет двусмысленности в определении, каждый SELECT имеет свои собственные отдельные предложения GROUP BY / HAVING.
person
Remus Rusanu
schedule
28.05.2012
Проще говоря, функции агрегирования работают со столбцом и генерируют скалярное значение, поэтому их нельзя применять к их результату. Когда вы создаете оператор выбора над скалярным значением, вы преобразуете его в искусственный столбец, поэтому он может снова использоваться функцией агрегирования.
Обратите внимание, что в большинстве случаев нет смысла применять функцию агрегирования к результату другой функции агрегирования: в вашем примере sum(count(id)) == count(id)
.
person
Gerardo Lima
schedule
29.05.2012
я хотел бы знать, каков ваш ожидаемый результат в этом sql
select sum(count(id)) as 'count'
from table
когда вы используете функцию count
, будет возвращен только 1 результат (общее количество). Итак, могу ли я спросить, почему вы хотите суммировать единственный результат?
Вы обязательно получите ошибку, потому что агрегатная функция не может работать с выражением, содержащим агрегат или подзапрос.
person
AKZap
schedule
29.05.2012
У меня он работает с использованием SQLFiddle, не знаю, почему это не сработает для вас. Но у меня есть объяснение, почему это может не сработать для вас и почему альтернатива сработает …
В вашем примере в качестве имени столбца используется ключевое слово, что не всегда работает. Но когда столбец находится только в подвыражении, механизм запросов может отказаться от имени (на самом деле, вероятно, так оно и есть), поэтому тот факт, что он потенциально потенциально конфликтует с ключевым словом, может быть проигнорирован.
РЕДАКТИРОВАТЬ: в ответ на ваше редактирование / комментарий. Нет, эти два понятия не эквивалентны. РЕЗУЛЬТАТ будет эквивалентным, но процесс получения этого результата совсем не похож. Чтобы первый сработал, синтаксическому анализатору нужно выполнить некоторую работу, которая просто не имеет смысла для него (применение агрегата к одному значению, либо построчно, либо как), во втором случае агрегат наносится на стол. Тот факт, что таблица является временной виртуальной таблицей, не будет иметь значения для агрегатной функции.
person
jmoreno
schedule
25.05.2012
Я думаю, вы можете написать запрос sql, который производит «количество» строк для требуемого вывода. Функции не принимают агрегированные функции, такие как «сумма» или агрегированный подзапрос. Моя проблема была решена с помощью простого запроса sql для подсчета ….
person
user2908745
schedule
28.02.2014
Microsoft SQL Server его не поддерживает.
Вы можете обойти эту проблему, используя Derived
таблицу:
select sum(x.count)
from
(
select count(id) as 'count'
from table
) x
С другой стороны, использование приведенного ниже кода даст вам сообщение об ошибке.
select sum(count(id)) as 'count'
from table
Невозможно выполнить агрегатную функцию для выражения, содержащего агрегат или подзапрос
person
Nilish
schedule
26.05.2012