Ошибка в sql с агрегатной функцией

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

flordogaso's user avatar

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

CrazyElf's user avatar

CrazyElfCrazyElf

65.5k5 золотых знаков19 серебряных знаков50 бронзовых знаков

1

The_Immortal

1569 / 505 / 48

Регистрация: 04.04.2009

Сообщений: 1,891

1

Часть агрегатной функции. Ошибка

28.12.2012, 23:25. Показов 47792. Ответов 6

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Ребят, подскажите, пожалуйста, что не так в данном выражении:

SQL
1
SELECT MAX(НомерЗаказа.Код), Товар.Цена * 2 FROM НомерЗаказа, Товар WHERE Товар.Код = 4

Акцесс ругается на конструкцию «Товар.Цена * 2» — но какое оно отношение имеет к функции MAX?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

28.12.2012, 23:25

6

mobile

Эксперт MS Access

26784 / 14463 / 3192

Регистрация: 28.04.2012

Сообщений: 15,782

28.12.2012, 23:41

2

Цитата
Сообщение от The_Immortal
Посмотреть сообщение

Ребят, подскажите, пожалуйста, что не так в данном выражении:

SQL
1
SELECT MAX(НомерЗаказа.Код), Товар.Цена * 2 FROM НомерЗаказа, Товар WHERE Товар.Код = 4

Акцесс ругается на конструкцию «Товар.Цена * 2» — но какое оно отношение имеет к функции MAX?

Раз есть агрегатная функция и поле без нее, то должна быть группировка по полю без функции. Либо все поля в агрегатах



1



The_Immortal

1569 / 505 / 48

Регистрация: 04.04.2009

Сообщений: 1,891

28.12.2012, 23:46

 [ТС]

3

mobile,

Цитата
Сообщение от mobile
Посмотреть сообщение

Раз есть агрегатная функция и поле без нее, то должна быть группировка по полю без функции

Вот так:

SQL
1
SELECT MAX(НомерЗаказа.Код), Товар.Цена * 2 AS SUM FROM НомерЗаказа, Товар WHERE Товар.Код = 4 GROUP BY SUM

? Тоже самое…



0



Эксперт MS Access

26784 / 14463 / 3192

Регистрация: 28.04.2012

Сообщений: 15,782

29.12.2012, 00:12

4

The_Immortal, группировать можно по полю. Но не по его алиасу, поскольку при компиляции алиас поля может быть еще неизвестен. Поэтому групп бай должен быть по Товар.Цена, а не по его алиасу SUM.
И второе — очень не рекомендуется давать имена полям из списка зарезервированных слов. SUM это зарезервированное в Jet SQL слово. Не используйте его для пользовательских имен



1



Kotinho7

0 / 0 / 0

Регистрация: 18.10.2018

Сообщений: 2

14.04.2020, 21:58

5

mobile,

SQL
1
2
3
4
5
6
7
8
PARAMETERS [Вкажіть породу] Text ( 255 );
TRANSFORM SUM(Нагороди.Грош_еквів) AS [Sum-Грош_еквів1]
SELECT Собаки.Кличка, Собаки.Порода, SUM(Нагороди.Грош_еквів) AS [Загальна сума]
FROM (Клуби INNER JOIN Собаки ON Клуби.Код_кл = Собаки.Клуб) INNER JOIN (Нагороди INNER JOIN (Змагання INNER JOIN Відомості ON Змагання.Код_змаг = Відомості.Змаг) ON Нагороди.Код_нагор = Відомості.Нагор) ON Собаки.Код_собаки = Відомості.Соб
WHERE (((Собаки.Порода) LIKE [Вкажіть породу]))
GROUP BY Собаки.Кличка
ORDER BY Собаки.Кличка
PIVOT Змагання.Назва_змаг;

Подскажите, что не так в этом запросе? ругается на поле Собаки.Порода, пишет, что запрос не содержит это выражение как часть агрегатной функции.



0



mobile

Эксперт MS Access

26784 / 14463 / 3192

Регистрация: 28.04.2012

Сообщений: 15,782

14.04.2020, 22:14

6

Цитата
Сообщение от Kotinho7
Посмотреть сообщение

Подскажите, что не так в этом запросе? ругается на поле Собаки.Порода, пишет, что запрос не содержит это выражение как часть агрегатной функции.

Пишет абсолютную правду. В запросах с группировками, а перекрестный запрос обязательно группирующий, все поля не под агрегатными функциями должны быть перечислены в предложении GROUP BY. А у Вас только Собаки.Кличка d GROUP BY. Породы нет. Надо вставить

SQL
1
2
3
4
5
6
7
8
PARAMETERS [Вкажіть породу] Text ( 255 );
TRANSFORM SUM(Нагороди.Грош_еквів) AS [Sum-Грош_еквів1]
SELECT Собаки.Кличка, Собаки.Порода, SUM(Нагороди.Грош_еквів) AS [Загальна сума]
FROM (Клуби INNER JOIN Собаки ON Клуби.Код_кл = Собаки.Клуб) INNER JOIN (Нагороди INNER JOIN (Змагання INNER JOIN Відомості ON Змагання.Код_змаг = Відомості.Змаг) ON Нагороди.Код_нагор = Відомості.Нагор) ON Собаки.Код_собаки = Відомості.Соб
WHERE Собаки.Порода = [Вкажіть породу]
GROUP BY Собаки.Кличка, Собаки.Порода
ORDER BY Собаки.Кличка
PIVOT Змагання.Назва_змаг;

В условии WHERE изменил Like на равенство. Если нет подстановочных знаков, то требуется только полное значение. И зачем тогда лайк? Не нужен. Это если хотите искать только по части слова, тогда Like:

SQL
1
WHERE Собаки.Порода LIKE "*" & [Вкажіть породу] & "*"



0



0 / 0 / 0

Регистрация: 18.10.2018

Сообщений: 2

14.04.2020, 22:21

7

Цитата
Сообщение от mobile
Посмотреть сообщение

В условии WHERE изменил Like на равенство. Если нет подстановочных знаков, то требуется только полное значение. И зачем тогда лайк? Не нужен. Это если хотите искать только по части слова, тогда Like:

В таком случае пишет: выражение неверно введено или слишком сложное для расчетов. Заменил на лайк, заработало, но ввожу параметр, а в результате запроса ни одной записи не выводит.



0



dvoryashin

Вот сам «правильный» запрос, с 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

Понравилась статья? Поделить с друзьями:
  • Ошибка в sql запросе что это такое
  • Ошибка в sql запросе select id from
  • Ошибка в splinter cell conviction код ошибки 1
  • Ошибка в sony vegas 0xc0000005
  • Ошибка в sony nw 102216 2 sony playstation