Разное

Ваш запрос не содержит указанное выражение как часть агрегатной функции: Ваш запрос не содержит указанное выражение как часть агрегатной функции access

sql — Как вывести столбец, соответствующий значению агрегатной функции?

Вопрос задан

Изменён 6 лет 3 месяца назад

Просмотрен 373 раза

К примеру, есть таблица с покупателями и есть таблица с заказами. В запросе я джойню эти таблицы по id покупателя, но вывожу в итоге лишь список покупателей со сводными данными по заказам. Так вот, мне нужно, чтобы в результаты запроса попал заказ с минимальной суммой. Саму минимальную сумму я могу вывести при помощи функции min(столбец_с_суммой), но как вывести, например, другое поле из таблицы с заказами, соответствующее минимальной сумме? Я, конечно, могу сделать что то типа

SELECT 
  п.покупатель
  , (SELECT Другое_поле FROM заказы зак WHERE зак. столбец_с_суммой = min(п.покупатель) AND зак.покупательИД = п.покупательИД)
FROM покупатели п
JOIN заказы з ON з.покупательИД = п.покупательИД
GROUP BY п.покупатель

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

  • sql
  • sql-server
  • sql-server-2005

1

Чутье подсказывает мне, что здесь можно воспользоваться оконными выражениями

Верно оно вам подсказывает.

Здесь можно воспользоваться нумерующей функцией ROW_NUMBER:

;WITH заказы_покупателя AS (
    SELECT
        з.покупательИД,
        з.столбец_с_суммой,
        з.Другое_поле,
        RN = ROW_NUMBER() OVER (
            PARTITION BY з.покупательИД
            ORDER BY з.
столбец_с_суммой) FROM заказы з ) SELECT п.покупатель, зп.столбец_с_суммой, зп.Другое_поле FROM покупатели п JOIN заказы_покупателя зп ON зп.покупательИД = п.покупательИД AND зп.RN = 1;

При помощи PARTITION BY задаём окно (нумеруем строки заказы з в пределах одинаковых з.покупательИД). При помощи ORDER BY задаём порядок нумерации (по увеличению з.столбец_с_суммой). В JOIN указываем дополнительное условие зп.RN = 1, что отфильтрует только одну строку для каждого зп.покупательИД (с минимальным значением столбец_с_суммой).

Если у одного покупателя может быть несколько заказов с одной и той же минимальной суммой и нужно выбрать из них какой-то конкретный, то в ORDER BY нужно добавить дополнительное поле, например дату заказа или его ИД ORDER BY з.столбец_с_суммой, з.заказИД

.

Если у одного покупателя может быть несколько заказов с одной и той же минимальной суммой и нужно выбрать их все, то вместо ROW_NUMBER() нужно использовать DENSE_RANK() OVER (PARTITION BY з. покупательИД ORDER BY з.столбец_с_суммой).

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Работа со столбцами в агрегатных запросах — Visual Database Tools

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья
  • Чтение занимает 2 мин

Применимо к:SQL Server

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

Параметр «Группировать по»

Конструктор запросов и представлений использует следующие правила для работы со столбцами:

  • При выборе параметра «Группировать по» или добавлении агрегатной функции в запрос все столбцы, помеченные для вывода или используемые для сортировки, автоматически добавляются в предложение GROUP BY. Столбцы не добавляются автоматически в предложение GROUP BY, если они уже являются частью агрегатной функции.

    Если нужно, чтобы определенный столбец не входил в предложение GROUP BY, необходимо вручную изменить его, выбрав другой параметр в столбце «Группировать по» на панели критериев. Однако конструктор запросов и представлений не будет препятствовать выбору параметра, который приведет к невозможности выполнения запроса.

  • Если выходной столбец добавлен в агрегатную функцию вручную на панели критериев или SQL, конструктор запросов и представлений не удалит автоматически другие выходные столбцы из запроса. Поэтому нужно удалить оставшиеся столбцы из вывода запроса или включить их в предложение GROUP BY либо в агрегатную функцию.

При вводе условия поиска в столбец «Фильтр» на панели критериев конструктор запросов и представлений следует таким правилам:

  • Если столбец Группировать сетки не отображен (так как статистический запрос еще не указан), условие поиска помещается в предложение WHERE.

  • Если статистический запрос уже задан и выбран параметр Где столбца Группировать , условие поиска помещается в предложение WHERE.

  • Если столбец Группировать содержит любые значения, отличные от Где, условие поиска помещается в предложение HAVING.

Использование предложений HAVING и WHERE

Следующие принципы описывают, как можно использовать столбцы в условиях поиска статистического запроса. Обычно можно использовать столбец в условии поиска для фильтрации строк, по которым должны быть подведены итоги (предложение WHERE), или чтобы определить, какие сгруппированные результаты появятся в конечном выводе (предложение HAVING).

  • Отдельные столбцы данных могут появляться как в предложениях WHERE, так и в предложениях HAVING в зависимости от того, как они используются в других частях запроса.

  • Предложения WHERE используются для выбора поднабора строк для подведения итогов или группировки и, следовательно, применяются перед любой группировкой. Поэтому можно использовать столбец данных в предложении WHERE, даже если он не указан в предложении GROUP BY или не содержится в агрегатной функции. Например, следующая инструкция выбирает все наименования, стоимость которых больше чем 10,00 $ и вычисляет среднюю цену:

    SELECT AVG(price)  
    FROM titles  
    WHERE price > 10  
    
  • Если создается условие поиска со столбцом, используемым также в предложении GROUP BY или в агрегатной функции, это условие может быть указано в предложении WHERE или HAVING. Предложение выбирает пользователь, когда создает условие. Например, следующая инструкция создает среднюю цену для наименований для каждого издателя и потом отображает среднее по издателям, у которых средняя цена больше чем 10,00 $:

    SELECT pub_id, AVG(price)  
    FROM titles  
    GROUP BY pub_id  
    HAVING (AVG(price) > 10)  
    
  • Если в условии поиска используется агрегатная функция, это условие затрагивает сводку и поэтому должно быть указано в предложении HAVING.

См. также:

Резюмирование результатов запросов (визуальные инструменты для баз данных)

Результаты запросов сортировки и группирования (визуальные инструменты для баз данных)

sql — «Вы пытались выполнить запрос, который не включает указанную агрегатную функцию»

спросил

Изменено 3 года назад

Просмотрено 176 тысяч раз

 ВЫБЕРИТЕ СУММУ(заказы. количество) КАК число, fИмя, фамилия
ОТ автора
ВНУТРЕННЕЕ СОЕДИНЕНИЕ book ON author.aID = book.authorID;
 

Я продолжаю получать сообщение об ошибке: «Вы пытались выполнить запрос, который не включает указанное выражение «fName» как часть агрегатной функции. Что мне делать?

  • sql
  • ms-access

1

Ошибка связана с тем, что fName включен в список SELECT , но не включен в предложение GROUP BY и не является частью агрегатной функции ( Count() , Min() , Max() , Sum() и т. д.)

Вы можете решить эту проблему, включив fName в GROUP BY . Но тогда вы столкнетесь с той же проблемой с фамилией . Так что поместите оба в GROUP BY :

 SELECT
    фимя,
    фамилия,
    Подсчет(*) КАК num_rows
ОТ
    автор
    книга ВНУТРЕННЕЕ СОЕДИНЕНИЕ
    ПО author. aID = book.authorID;
ГРУППА ПО
    фимя,
    фамилия
 

Примечание Я использовал Количество(*) , где вы хотели СУММА (заказы.количество) . Однако заказы не включены в раздел FROM вашего запроса, поэтому вы должны включить его, прежде чем сможете Sum() одно из его полей.

Если у вас есть доступ, создайте запрос в конструкторе запросов. Это может помочь вам понять, какие функции возможны, и применить правильный синтаксис Access SQL.

6

У меня была аналогичная проблема в запросе MS-Access, и я решил ее, изменив свой эквивалент fName в «Выражение» (в отличие от «Группировать по» или «Сумма»). Пока все мои поля были «Выражение», построитель запросов Access не требовал в конце предложения Group By .

3

GROUP BY можно выбрать в строке Total в представлении дизайна запроса в MS Access.
Если строка Total не отображается в режиме конструктора (как в моем случае). Вы можете перейти в представление SQL и добавить GROUP By fname и т. д. Затем строка Total автоматически отобразится в представлении дизайна.
В этой строке для вычисляемых полей необходимо выбрать Выражение.

1

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

sql — «Запрос не включает указанное выражение как часть агрегатной функции» при поиске первых 3 значений в группе

спросил

Изменено 4 года, 6 месяцев назад

Просмотрено 2к раз

Это пример некоторых моих данных:

Я пытаюсь получить 3 верхних значения L при группировке по ID_stop и Nn .

Я попробовал следующий SQL:

 SELECT TOP 3 Sclerometrica_equotip.ID_stop, Sclerometrica_equotip.Nn, Sclerometrica_equotip.L
ОТ Sclerometrica_equotip
СГРУППИРОВАТЬ ПО Sclerometrica_equotip.ID_stop, Sclerometrica_equotip.Nn
ПОРЯДОК ПО Sclerometrica_equotip.ID_stop, Sclerometrica_equotip.Nn;
 

но получил следующую ошибку:

Запрос не включает указанное выражение как часть агрегатной функции.

  1. Я не понимаю сообщение об ошибке. Может ли кто-нибудь объяснить это мне?
  2. Как мне выполнить то, что я пытаюсь сделать?
  • sql
  • ms-access

Ошибка означает, что в вашем запросе есть поля, которые не являются частью группировки, а также не объединены вместе с помощью агрегатной функции.

При группировании вы объединяете набор записей на основе сгруппированных полей (в данном случае ID_stop и Nn ).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *