What is my mistake in this statement?
Select Max (TBLvirtual.c2) as MOF --> Most ordered food (MOF)--//
,TBLvirtual.c1
from
(select a.OrdItems as c1, count(a.OrdID) as c2
from Orderrouter a
group by a.OrdItems) as TBLvirtual
I received this error:
Msg 8120, Level 16, State 1, Line 3 Column ‘TBLvirtual.c1’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Taryn
243k57 gold badges362 silver badges405 bronze badges
asked Oct 11, 2012 at 23:51
Any fields that you have in the SELECT
that are not included in an aggregate function must be in a GROUP BY
:
Select Max(TBLvirtual.c2) as MOF --> Most ordered food (MOF)--//
,TBLvirtual.c1
from
(
select a.OrdItems as c1 ,
count(a.OrdID)as c2
from Orderrouter a
group by a.OrdItems
) as TBLvirtual
group by TBLvirtual.c1 -- add this line
If you only want one row (See SQL Fiddle With Demo):
Select Top 1 c1, c2
from
(
select a.OrdItems as c1 ,
count(a.OrdID)as c2
from Orderrouter a
group by a.OrdItems
) as TBLvirtual
order by c2 desc
And you don’t really need the derived table:
Select Top 1
a.OrdItems as c1 ,
count(a.OrdID) as c2
from Orderrouter a
group by a.OrdItems
order by c2 desc ;
ypercubeᵀᴹ
113k19 gold badges174 silver badges235 bronze badges
answered Oct 11, 2012 at 23:58
TarynTaryn
243k57 gold badges362 silver badges405 bronze badges
3
The inner Group By for count has already made C1 unique so there is no need doing aggregate on them for MAX. Do this
select a.OrdItems as c1, count(a.OrdID) as c2
from Orderrouter a
group by a.OrdItems
order by count(a.OrdID) desc
That will give you the highest count first followed by the next. If you want top 1 or top N, do
Select TOP 1 c1, c2 FROM
(
select a.OrdItems as c1, count(a.OrdID) as c2
from Orderrouter a
group by a.OrdItems
) TopMost
Order By C2 DESC
answered Oct 12, 2012 at 0:11
codingbizcodingbiz
26.2k8 gold badges59 silver badges96 bronze badges
3
0 / 0 / 0 Регистрация: 19.12.2011 Сообщений: 10 |
|
1 |
|
19.12.2011, 11:49. Показов 66612. Ответов 20
Доброго времени суток! Есть таблица типа: Необходимо выбрать сгруппировав из таблицы сообщение, количество его повторений и дату последнего сообщения, чтобы в итоге было так: ааа 3 10:16 Ругается: «Столбец недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.»
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
19.12.2011, 11:49 |
20 |
168 / 142 / 1 Регистрация: 01.04.2010 Сообщений: 474 |
|
19.12.2011, 11:59 |
2 |
Ругается: Ругается на что? Какой код запроса?
0 |
Ice_and_Fire 512 / 298 / 37 Регистрация: 22.06.2011 Сообщений: 929 |
||||
19.12.2011, 12:05 |
3 |
|||
1 |
nukanaka 0 / 0 / 0 Регистрация: 19.12.2011 Сообщений: 10 |
||||||||
19.12.2011, 13:10 [ТС] |
4 |
|||||||
Спасибо! Добавлено через 15 минут
Ругается вот так:
0 |
512 / 298 / 37 Регистрация: 22.06.2011 Сообщений: 929 |
|
19.12.2011, 13:17 |
5 |
Что мешает указать EAS_Mess.d в group by ?
0 |
0 / 0 / 0 Регистрация: 19.12.2011 Сообщений: 10 |
|
19.12.2011, 13:21 [ТС] |
6 |
Что мешает указать EAS_Mess.d в group by ? поправьте меня, если я не прав:
0 |
Ice_and_Fire 512 / 298 / 37 Регистрация: 22.06.2011 Сообщений: 929 |
||||
19.12.2011, 13:32 |
7 |
|||
Каждый столбец таблицы или представления в любом нестатистическом выражении в списке <select> должен быть включен в список GROUP BY (C) MSDN
0 |
0 / 0 / 0 Регистрация: 19.12.2011 Сообщений: 10 |
|
19.12.2011, 13:37 [ТС] |
8 |
Убрал сортировку и добавил в group by EAS_mess.dt, ошибка прежняя: Сообщение 8120, уровень 16, состояние 1, строка 1
0 |
Ice_and_Fire 512 / 298 / 37 Регистрация: 22.06.2011 Сообщений: 929 |
||||
19.12.2011, 13:49 |
9 |
|||
0 |
nukanaka 0 / 0 / 0 Регистрация: 19.12.2011 Сообщений: 10 |
||||||||
19.12.2011, 13:52 [ТС] |
10 |
|||||||
Ошибка: Вот как-то так!
0 |
512 / 298 / 37 Регистрация: 22.06.2011 Сообщений: 929 |
|
19.12.2011, 14:01 |
11 |
SELECT DISTINCT EAS_Mess.dt, EAS_IdMess.mess GROUP BY EAS_Mess.mess, EAS_Mess.dt Это не то поле!
0 |
0 / 0 / 0 Регистрация: 19.12.2011 Сообщений: 10 |
|
19.12.2011, 14:16 [ТС] |
12 |
Это не то поле! Ага, исправил: не ругается, но и не группирует сообщения.
0 |
Ice_and_Fire 512 / 298 / 37 Регистрация: 22.06.2011 Сообщений: 929 |
||||
19.12.2011, 14:21 |
13 |
|||
не ругается, но и не группирует сообщения. А по какому признаку будет группировать? Где агрегатная функция?
И обрати внимание на порядок следования столбцов в group by — он важен
0 |
0 / 0 / 0 Регистрация: 19.12.2011 Сообщений: 10 |
|
19.12.2011, 14:29 [ТС] |
14 |
как я писал в начале мне необходимо чтобы группировалось по сообщению (mess), считалось количество этих сообщений (count(mess)) и выводилась последняя дата сообщения (max(dt)) как это сделать? я очень-очень новичок, помогите плиз
0 |
Ice_and_Fire 512 / 298 / 37 Регистрация: 22.06.2011 Сообщений: 929 |
||||
19.12.2011, 14:33 |
15 |
|||
1 |
nukanaka 0 / 0 / 0 Регистрация: 19.12.2011 Сообщений: 10 |
||||
19.12.2011, 14:45 [ТС] |
16 |
|||
сделал вот так:
Все работает как надо!
0 |
homich77 81 / 80 / 4 Регистрация: 06.04.2009 Сообщений: 326 |
||||
19.12.2011, 18:56 |
17 |
|||
AND (dt >= ‘20100915 10:00’ AND dt <= ‘20111219 09:00’) не проще сделать через between? Добавлено через 1 минуту
FROM EAS_Mess, EAS_IdMess а здесь лучше сделать через inner join:
Добавлено через 2 минуты
только почему-то счетчик пришлось делить на 2, иначе считает сообщения дважды) не очень понятно
0 |
nukanaka 0 / 0 / 0 Регистрация: 19.12.2011 Сообщений: 10 |
||||
11.01.2012, 10:47 [ТС] |
18 |
|||
При таком запросе все равно выдает значения в два раза больше чем реальные:
0 |
Devil_FoX 168 / 142 / 1 Регистрация: 01.04.2010 Сообщений: 474 |
||||
11.01.2012, 19:56 |
19 |
|||
nukanaka, а проверь ка табл. EAS_Mess и EAS_IdMess на задвоенния.
0 |
nukanaka 0 / 0 / 0 Регистрация: 19.12.2011 Сообщений: 10 |
||||||||
12.01.2012, 08:53 [ТС] |
20 |
|||||||
nukanaka, а проверь ка табл. EAS_Mess и EAS_IdMess на задвоенния.
проверил этим запросом, в ответ пустота, решил проблему вот таким образом:
0 |
Transact sql error message Msg 8120 Level 16 — Column is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Msg 8120 Level 16 Example:
Invalid select:
USE model;
GO
SELECT MAX(id), first_name, last_name FROM students;
GO
Message |
---|
Msg 8120, Level 16, State 1, Line 1 |
Column ‘students.first_name’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. |
Correct select:
USE model;
GO
SELECT MAX(id), first_name, last_name FROM students
GROUP BY first_name, last_name;
GO
Other error messages:
- Cannot drop the table
- Is not a constraint
- Create View or Function failed because no column name was specified
- Cannot define PRIMARY KEY constraint on nullable column in table
- String or binary data would be truncated
- The database name component of the object qualifier must be the name of the current database
- No item by the name of ‘%’ could be found in the current database.
- Remove From My Forums
-
Question
-
Hi,
I know the above error has been discussed at length but I’m unable to find a solution for my query. I have a table called TaxLotsHistory where the columns ‘Date’ and ‘ReportDate’ are defined as date. Ticker and Quantity are defined as varchar and integer
respectively. Ultimately I would like to use this query to define a view or a function (hence the derived table). The query I have is:USE FundDB SELECT TLH.Ticker, TLH.Quantity, dt.ReportDate, dt.LTST FROM Portfolio.TaxLotsHistory TLH INNER JOIN ( SELECT Max(ReportDate) AS ReportDate, Date, DATEDIFF(DAY, Date, ReportDate) AS LTST From Portfolio.TaxLotsHistory ) AS dt ON TLH.ReportDate = dt.ReportDate Group by TLH.Date, dt.ReportDate GO
The error says:
Msg 8120, Level 16, State 1, Line 7
Column ‘Portfolio.TaxLotsHistory.Date’ is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.I think I have tried almost every possible combination with the Date and ReportDate columns in my GROUP BY clause but I keep getting that error. SQL server requires any column in the SELECT list that are not in an aggregate function be included in GROUP
BY. I thought I did that. What am I doing wrong?
Answers
-
with cteMaxReportDate(ReportDate) as ( select max(reportdate) from TaxLotsHistory ) select a.Ticker,a.[Date],a.Quantity,b.ReportDate,datediff(day,[Date],b.[ReportDate]) from TaxLotsHistory a cross join cteMaxReportDate b
-
Marked as answer by
Friday, August 19, 2016 1:30 PM
-
Marked as answer by
Ошибка «Столбец недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.», Упомянутый ниже, возникает, когда вы выполняете«ГРУППА ПО», И вы включили как минимум один столбец в список выбора, который не является частью предложения group by и не содержится в агрегатной функции, например макс (), мин (), сумма (), счет () и avg (). Итак, чтобы запрос работал, нам нужно добавить все неагрегированные столбцы в любое предложение group by, если это возможно и не влияет на результаты, или включить эти столбцы в подходящую агрегатную функцию, и это будет работать как шарм. Ошибка возникает в MS SQL, но не в MySQL.
Два ключевых слова «Группа по» и «агрегатная функция»Были использованы в этой ошибке. Поэтому мы должны понимать, когда и как их использовать.
Группировать по пункту:
Когда аналитику необходимо суммировать или агрегировать данные, такие как прибыль, убыток, продажи, затраты, зарплата и т. Д., С помощью SQL, «ГРУППА ПО»Очень помогает в этом отношении. Например, чтобы подвести итог, ежедневные продажи, чтобы показать высшему руководству. Точно так же, если вы хотите подсчитать количество студентов на факультете в университетской группе, а агрегированная функция поможет вам в этом.
Группировать по стратегии разделения-применения-объединения:
Группа по использует стратегию «разделить-применить-объединить»
- Разделенная фаза делит группы по их значениям.
- На этапе применения применяется агрегатная функция и генерируется одно значение.
- Комбинированный этап объединяет все значения в группе как одно значение.
На рисунке выше мы видим, что столбец был разделен на три группы на основе первого столбца C1, а затем к сгруппированным значениям применяется агрегатная функция. Наконец, фаза комбинирования присваивает каждой группе одно значение.
Это можно пояснить на примере ниже. Сначала создайте базу данных с именем «appuals».
Пример:
Создать таблицу «наемный рабочий», Используя следующий код.
ИСПОЛЬЗУЙТЕ [appuals] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO SET ANSI_PADDING ON GO CREATE TABLE [dbo]. [Employee] ([e_id] [int] NOT NULL, [e_ename] [varchar] (50) NULL, [dep_id] [int] NULL, [salary] [int] NULL, CONSTRAINT [PK_employee] PRIMARY KEY CLUSTERED ([e_id] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLKSOW_ROW_LOCKS = ON_LOCKS = ON, ALLKSOW_ROW_LOCKS = ON, ALL PRIMARY]) ON [PRIMARY] GO SET ANSI_PADDING OFF GO
Теперь вставьте данные в таблицу, используя следующий код.
Вставить в значения сотрудников (e_id, e_ename, dep_id, salary) (101, ‘Sadia’, 1,6000), (102, ‘Saba’, 1,5000), (103, ‘Sana’, 2,4000), ( 104, «Хаммад», 2,3000), (105, «Умер», 3,4000), (106, «Канвал», 3,2000)
Результат будет таким.
Теперь выберите данные из таблицы, выполнив следующую инструкцию.
выберите * от сотрудника
Результат будет таким.
Теперь сгруппируйте по таблице по идентификатору отдела.
выберите dep_id, зарплату из группы сотрудников по dep_id
Ошибка: столбец employee.sallary недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
Вышеупомянутая ошибка возникает из-за того, что выполняется запрос «GROUP BY» и вы включили столбец «employee.salary» в список выбора, который не является ни частью предложения group by, ни включенным в агрегатную функцию.
Решение:
Как мы знаем, «группа по» возвращает одну строку, поэтому нам нужно применить агрегатную функцию к столбцам, не используемым в предложении group by, чтобы избежать этой ошибки. Наконец, примените группировку по и агрегатную функцию, чтобы найти среднюю зарплату сотрудника в каждом отделе, выполнив следующий код.
выберите dep_id, avg (salary) как average_sallary из группы сотрудников по dep_id
Более того, если изобразить эту таблицу в соответствии со структурой split_apply_combine, она будет выглядеть так.
На приведенном выше рисунке показано, что в первую очередь таблица сгруппирована в три группы в соответствии с идентификатором отдела, затем применяется функция агрегирования avg () для нахождения совокупного среднего значения зарплаты, которое затем объединяется с идентификатором отдела. Таким образом, таблица сгруппирована по идентификатору отдела, а заработная плата агрегирована по отделам.
Агрегатные функции:
- Сумма (): Возвращает общую сумму каждой группы или суммы
- Счетчик (): Не возвращает ни одной строки в каждой группе.
- Среднее (): Возвращает среднее или среднее значение для каждой группы
- Мин (): Возвращает минимальное значение каждой группы
- Максимум(): Возвращает максимальное значение каждой группы.
Логическое описание совместного использования функций группировки и агрегирования:
Теперь мы разберемся с использованием «группировать по» и «агрегатных функций» логически на примере.
Создайте таблицу с именем «люди»В базе данных, используя следующий код.
ИСПОЛЬЗУЙТЕ [appuals] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo]. [People] ([id] [bigint] IDENTITY (1,1) NOT NULL, [name] [varchar] (500) NULL, [ city] [varchar] (500) NULL, [состояние] [varchar] (500) NULL, [age] [int] NULL) ON [PRIMARY] GO
Теперь вставьте данные в таблицу, используя следующий запрос.
вставить в значения людей (имя, город, штат, возраст) (‘Meggs’, ‘MONTEREY’, ‘CA’, 20), (‘Staton’, ‘HAYWARD’, ‘CA’, 22), (‘Irons’, IRVINE, CA, 25) (Krank, PLEASANT, IA, 23), (Davidson, WEST BURLINGTON, IA, 40), (Pepewachtel, FAIRFIELD ‘,’ IA ‘, 35) (‘ Schmid ‘,’ HILLSBORO ‘,’ OR ‘, 23), (‘ Davidson ‘,’ CLACKAMAS ‘,’ OR ‘, 40), (‘ Condy ‘,’ GRESHAM ‘,’ ИЛИ ‘, 35)
Результат будет таким:
Если аналитику не нужно знать жителей и их возраст в разных штатах. Следующий запрос поможет ему получить требуемые результаты.
выберите возраст, посчитайте ( *) как no_of_residents из группы людей по штатам
Ошибка: Столбец «people.age» недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
При выполнении вышеупомянутого запроса мы столкнулись со следующей ошибкой
«Сообщение 8120, уровень 16, состояние 1, строка 16 Столбец« people.age »недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY».
Эта ошибка возникает из-за того, что «ГРУППА ПО» запрос выполнен и вы включили «‘люди. возраст» столбец в списке выбора, который не является частью предложения group by и не включен в агрегатную функцию.
При группировке по состоянию возникает ошибка
Логическое описание и решение:
Это не синтаксическая ошибка, это логическая ошибка. Поскольку мы видим, что столбец «no_of_residents» возвращает только одну строку, как теперь мы можем вернуть возраст всех жителей в одном столбце? У нас может быть список возраста людей, разделенный запятыми, или средний возраст, минимальный или максимальный возраст. Таким образом, нам нужно больше информации о столбце «возраст». Мы должны дать количественную оценку тому, что мы подразумеваем под столбцом возраста. По возрасту то, что мы хотим вернуть. Теперь мы можем изменить наш вопрос, добавив более конкретную информацию о столбце возраста, как это.
Найдите не жителей, а также средний возраст жителей в каждом штате. Учитывая это, мы должны изменить наш запрос, как показано ниже.
выберите штат, avg (age) как Age, подсчитайте ( *) как no_of_residents из группы людей по штатам
Это будет выполнено без ошибок, и результат будет таким.
Так что также важно логически подумать о том, что возвращать в операторе select.
Кроме того, следует учитывать следующие моменты, когда использование «группировать по», чтобы избежать ошибок.
- Предложение GROUP BY идет после предложения where и перед предложением order by.
- Мы можем использовать предложение where для исключения строк перед применением предложения «group by».
- Если группирующий столбец содержит пустую строку, эта строка представляет собой отдельную группу. Более того, если столбец содержит более одного нуля, они помещаются в одну нулевую группу, как показано в следующем примере.
Группировать по и значениям NULL:
Сначала добавьте в таблицу еще одну строку с именем «люди» с пустым / нулевым столбцом «состояние».
вставить в значения людей (имя, город, штат, возраст) (’Kanwal’, ’GRESHAM’, ’’, 35)
Теперь выполните следующую инструкцию.
выберите штат, avg (age) как Age, подсчитайте ( *) как no_of_residents из группы людей по штатам
На следующем рисунке показан результат. Вы можете видеть, что пустое значение в столбце состояния рассматривается как отдельная группа.
Теперь увеличьте количество пустых строк, вставив больше строк в таблицу с нулевым состоянием.
вставить в значения людей (имя, город, штат, возраст) (’Kanwal’, ’IRVINE’, ’NULL’, 35), (’Krank’, ’PLEASANT’, ’NULL’, 23)
Теперь снова выполните тот же запрос для выбора вывода. Результат будет таким.
На этом рисунке видно, что пустой столбец рассматривается как отдельная группа, а пустой столбец с двумя строками рассматривается как другая отдельная группа с двумя номерами жителей. Вот как работает «group by».