«Столбец недействителен в списке выбора»

Ошибка «Столбец недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY», упомянутая ниже, возникает, когда вы выполняете запрос «GROUP BY» и вы включили хотя бы один столбец в список выбора. который не является частью предложения group by и не содержится в агрегатных функциях, таких как max(), min(), sum(), count() и avg(). Поэтому, чтобы заставить запрос работать, нам нужно добавить все неагрегированные столбцы в любое предложение group by, если это возможно и не оказывает никакого влияния на результаты, или включить эти столбцы в подходящую агрегатную функцию, и это будет работать как шарм. Ошибка возникает в MS SQL, но не в MySQL.

Ошибка «Столбец недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY»

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

В этой ошибке использовались два ключевых слова «Группировать по» и «Агрегатная функция». Поэтому мы должны понимать, когда и как их использовать.

Сгруппировать по пункту:

Когда аналитику необходимо обобщить или агрегировать данные, такие как прибыль, убыток, объем продаж, себестоимость, заработная плата и т. д., с помощью SQL, в этом отношении очень полезна функция «ГРУППИРОВАТЬ ПО». Например, подводя итоги, ежедневные продажи показывать высшему руководству. Точно так же, если вы хотите подсчитать количество студентов на факультете в университетской группе, вместе с функцией агрегирования это поможет вам в этом.

Сгруппировать по стратегии Split-Apply-Combine:

Группировка по стратегии «разделить-применить-объединить»

  • Разделенная фаза разделяет группы по их значениям.
  • Фаза применения применяет агрегатную функцию и генерирует одно значение.
  • Объединенная фаза объединяет все значения в группе как одно значение.

Пример стратегии «SPLIT_APPLY_COMBINE»

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

Это можно пояснить на примере ниже. Сначала создайте базу данных с именем «appuals».

Создание базы данных

Пример:

Создайте таблицу «employee», используя следующий код.

ИСПОЛЬЗОВАТЬ [appuals]
GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo].[employee](
[e_id] [int] НЕ НОЛЬ,
[e_ename] [varchar](50) НОЛЬ,
[dep_id] [int] НУЛЕВОЙ,
[salary] [int] НУЛЬ, ОГРАНИЧЕНИЕ [PK_employee] ПЕРВИЧНЫЙ КЛЮЧ КЛАСТЕРНЫЙ (
[e_id] ASC )С (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) НА [PRIMARY]
GO SET ANSI_PADDING OFF GOСоздание таблицы сотрудников

Теперь вставьте данные в таблицу, используя следующий код.

Вставить в сотрудника (e_id, e_ename, dep_id, зарплата) значения (101, «Садия», 1,6000), (102, «Саба», 1,5000), (103, «Сана», 2,4000), ( 104, «Хаммад», 23000), (105, «Умер», 34000), (106, «Канвал», 32000)

Вывод будет таким.

Вставка данных в таблицу «Сотрудник»

Теперь выберите данные из таблицы, выполнив следующую инструкцию.

выбрать * у сотрудника

Вывод будет таким.

Вывод из таблицы сотрудников.

Теперь сгруппируйте по таблице в соответствии с идентификатором отдела.

выберите dep_id, зарплату из группы сотрудников по dep_id

Ошибка: столбец «employee.sallary» недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Упомянутая выше ошибка возникает из-за того, что выполняется запрос «GROUP BY», и вы включили столбец «employee.salary» в список выбора, который не является ни частью предложения group by, ни включенным в агрегатную функцию.

Ошибка «Столбец «employee.salary» недействителен в списке выбора, поскольку он не содержится в
либо агрегатная функция, либо предложение GROUP BY».

Решение:

Поскольку мы знаем, что «group by» возвращает одну строку, поэтому нам нужно применить агрегатную функцию к столбцам, не используемым в предложении group by, чтобы избежать этой ошибки. Наконец, примените группировку и агрегатную функцию, чтобы найти среднюю зарплату сотрудника в каждом отделе, выполнив следующий код.

выберите dep_id,avg(salary) как medium_sallary из группы сотрудников по dep_idНайдите среднюю заработную плату сотрудника в каждом отделе

Кроме того, если мы изобразим эту таблицу в соответствии со структурой split_apply_combine, она будет выглядеть так.

Стратегия «РАЗДЕЛИТЬ-ПРИМЕНИТЬ-ОБЪЕДИНИТЬ» применяется к таблице сотрудников для определения средней зарплаты по отделам.

На рисунке выше показано, что, прежде всего, таблица сгруппирована в три группы в соответствии с идентификатором отдела, затем применяется функция агрегирования avg() для нахождения совокупного среднего значения заработной платы, которое затем объединяется с идентификатором отдела. Таким образом, таблица сгруппирована по идентификатору отдела, а зарплата агрегирована по отделам.

Агрегатные функции:

  • Sum(): возвращает общее количество каждой группы или суммы
  • Count(): возвращает количество строк в каждой группе.
  • Avg(): возвращает среднее или среднее значение каждой группы.
  • Min(): возвращает минимальное значение каждой группы
  • Max(): возвращает максимальное значение каждой группы.

Логическое описание совместного использования групповых и агрегатных функций:

Теперь мы логически поймем использование «группировать по» и «агрегатные функции» на примере.

Создайте в базе данных таблицу с именем «люди», используя следующий код.

ИСПОЛЬЗОВАТЬ [appuals]
GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[people](
[id] [bigint] ИДЕНТИЧНОСТЬ(1,1) НЕ НУЛЕВАЯ,
[name] [varchar](500) НОЛЬ,
[city] [varchar](500) НОЛЬ,
[state] [varchar](500) НОЛЬ,
[age] [int] НУЛЕВОЕ ) ВКЛ. [PRIMARY]
ИДТИСоздание таблицы

Теперь вставьте данные в таблицу, используя следующий запрос.

вставить в людей (имя, город, штат, возраст) значения (‘Meggs’, ‘MONTEREY’, ‘CA’, 20), (‘Staton’, ‘HAYWARD’, ‘CA’, 22), (‘Irons’, ‘ИРВИН’, ‘КА’, 25) (“Кранк”, ‘ПРИЛОЖЕН’, ‘ИА’, 23), (‘Дэвидсон’, ‘ЗАПАДНЫЙ БЕРЛИНГТОН’, ‘ИА’, 40), (‘Пепевахтел’, ‘ФЭРФИЛД ‘ ,’IA’,35) (‘Шмид’, ‘ХИЛЛСБОРО’, ‘ИЛИ’, 23), (‘Дэвидсон’, ‘КЛАКАМАС’, ‘ИЛИ’, 40), (‘Конди’, ‘ГРЕШЭМ’,’ ИЛИ’,35)

Вывод будет таким:

Вставка данных в таблицу с именем «люди»

Если аналитику нужно знать количество жителей и их возраст в разных штатах. Следующий запрос поможет ему в получении требуемых результатов.

выбрать возраст, количество

как no_of_ Residents из группы людей по штатам

Ошибка: столбец «people.age» недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

При выполнении вышеупомянутого запроса мы столкнулись со следующей ошибкой

«Сообщение 8120, уровень 16, состояние 1, строка 16. Столбец «people.age» недействителен в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY».

Эта ошибка возникает из-за того, что выполняется запрос «ГРУППИРОВАТЬ ПО» и вы включили «люди. age» в списке выбора, который не является частью предложения group by и не включен в агрегатную функцию.

При группировке по состоянию возникает ошибка

Логическое описание и решение:

Это не синтаксическая ошибка, а логическая ошибка. Поскольку мы видим, что столбец «no_of_residents» возвращает только одну строку, как теперь мы можем вернуть возраст всех жителей в одном столбце? У нас может быть список возрастов людей, разделенных запятыми, или средний возраст, минимальный или максимальный возраст. Таким образом, нам нужно больше информации о столбце «возраст». Мы должны количественно определить, что мы подразумеваем под столбцом возраста. По возрасту то, что мы хотим вернуть. Теперь мы можем изменить наш вопрос, указав более конкретную информацию о столбце возраста, как показано ниже.

Найдите количество жителей вместе со средним возрастом жителей в каждом штате. Учитывая это, мы должны изменить наш запрос, как показано ниже.

выберите состояние, средний (возраст) как возраст, количество

как no_of_ Residents из группы людей по штатам

Это будет выполнено без ошибок, и вывод будет таким.

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

  • Поэтому очень важно логически подумать о том, что следует вернуть в операторе select.
  • Кроме того, при использовании «группировать по» следует учитывать следующие моменты, чтобы избежать ошибок.
  • Предложение GROUP BY идет после предложения where и перед предложением order by.

Мы можем использовать предложение where для удаления строк перед применением предложения «group by».

Если столбец группировки содержит нулевую строку, эта строка представляет собой группу сама по себе. Кроме того, если столбец содержит более одного значения NULL, они помещаются в одну группу значений NULL, как показано в следующем примере.

Группировать по значениям NULL:Сначала добавьте в таблицу еще одну строку с именем «люди» со столбцом «состояние» как пустым/нулевым.

вставить в значения людей (имя, город, штат, возраст) («Канвал», «ГРЕШАМ», ”, 35)

Добавление NULL/пустого значения в столбец, к которому необходимо применить предложение group by

Теперь выполните следующую инструкцию.

выберите состояние, средний (возраст) как возраст, количество

как no_of_ Residents из группы людей по штатам

На следующем рисунке показан его вывод. Вы можете видеть, что пустое значение в столбце состояния рассматривается как отдельная группа.Пустое значение в столбце, к которому была применена группа, рассматривается как одна группа

Теперь увеличьте отсутствие нулевых строк, вставив в таблицу больше строк с нулевым состоянием.

вставить в людей (имя, город, штат, возраст) значения (‘Kanwal’,’IRVINE’,’NULL’,35), (‘Krank’, ‘PLEASANT’, ‘NULL’,23)

Вставка значения NULL в столбец, к которому применена «группировка по».

Теперь снова выполните тот же запрос, чтобы выбрать вывод. Результирующий набор будет таким.«Нулевое» значение в столбце, к которому была применена группа, считается одной группой. На этом рисунке мы видим, что пустой столбец рассматривается как отдельная группа, а нулевой столбец с двумя строками рассматривается как еще одна отдельная группа с двумя номерами резидентов. Вот как работает «группировать по».

Программы для Windows, мобильные приложения, игры - ВСЁ БЕСПЛАТНО, в нашем закрытом телеграмм канале - Подписывайтесь:)

Похожие записи

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

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