Ошибка 8120 sql

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's user avatar

Taryn

243k57 gold badges362 silver badges405 bronze badges

asked Oct 11, 2012 at 23:51

Mehrdad's user avatar

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ᵀᴹ's user avatar

ypercubeᵀᴹ

113k19 gold badges174 silver badges235 bronze badges

answered Oct 11, 2012 at 23:58

Taryn's user avatar

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

codingbiz's user avatar

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


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

Доброго времени суток!
Помогите плиз с запросом, недавно работаю с SQL, помощь просто необходима.

Есть таблица типа:
10:04 ааа
10:06 ааа
10:09 ббб
10:15 ввв
10:16 ааа
10:19 ввв
10:22 ббб

Необходимо выбрать сгруппировав из таблицы сообщение, количество его повторений и дату последнего сообщения, чтобы в итоге было так:

ааа 3 10:16
ббб 2 10:22
ввв 2 10:19

Ругается:

«Столбец недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении 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

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

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

Ругается на что? Какой код запроса?



0



Ice_and_Fire

512 / 298 / 37

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

Сообщений: 929

19.12.2011, 12:05

3

T-SQL
1
2
3
Select st1,count(st2) , max(st3)
from t
group by st1



1



nukanaka

0 / 0 / 0

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

Сообщений: 10

19.12.2011, 13:10

 [ТС]

4

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

T-SQL
1
2
3
Select st1,count(st2) , max(st3)
from t
group by st1

Спасибо!
Все проще, чем я предполагал)

Добавлено через 15 минут
Тааак, задание усложнилось, есть еще справочная таблица.
запрос такой:

SQL
1
2
3
4
5
SELECT DISTINCT EAS_Mess.dt, EAS_IdMess.mess 
FROM EAS_Mess, EAS_IdMess 
WHERE EAS_Mess.mess=EAS_IdMess.idm AND (dt >= '20100915 10:00' AND dt <= '20111219 09:00') 
GROUP BY EAS_Mess.mess
ORDER BY dt ASC

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



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

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

Что мешает указать EAS_Mess.d в group by ?

поправьте меня, если я не прав:
Если в group by указываем EAS_Mess.dt, тогда группироваться будет по дате, а даты в моем случае все разные



0



Ice_and_Fire

512 / 298 / 37

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

Сообщений: 929

19.12.2011, 13:32

7

Каждый столбец таблицы или представления в любом нестатистическом выражении в списке <select> должен быть включен в список GROUP BY (C) MSDN

SQL
1
GROUP BY EAS_Mess.mess, EAS_Mess.dt



0



0 / 0 / 0

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

Сообщений: 10

19.12.2011, 13:37

 [ТС]

8

Убрал сортировку и добавил в group by EAS_mess.dt, ошибка прежняя:

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



0



Ice_and_Fire

512 / 298 / 37

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

Сообщений: 929

19.12.2011, 13:49

9

T-SQL
1
GROUP BY EAS_Mess.mess, EAS_Mess.dt



0



nukanaka

0 / 0 / 0

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

Сообщений: 10

19.12.2011, 13:52

 [ТС]

10

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

T-SQL
1
GROUP BY EAS_Mess.mess, EAS_Mess.dt
SQL
1
2
3
4
SELECT DISTINCT EAS_Mess.dt, EAS_IdMess.mess 
FROM EAS_Mess, EAS_IdMess 
WHERE EAS_Mess.mess=EAS_IdMess.idm AND (dt >= '20100915 10:00' AND dt <= '20111219 09:00') 
GROUP BY EAS_Mess.mess, EAS_Mess.dt

Ошибка:
Сообщение 8120, уровень 16, состояние 1, строка 1
Столбец «EAS_IdMess.mess» недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

Вот как-то так!



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

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

Это не то поле!

Ага, исправил:

Столбец недопустим в списке выбора, поскольку он не содержится ни в статистической функции, ни в предложении GROUP BY.

не ругается, но и не группирует сообщения.



0



Ice_and_Fire

512 / 298 / 37

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

Сообщений: 929

19.12.2011, 14:21

13

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

не ругается, но и не группирует сообщения.

А по какому признаку будет группировать? Где агрегатная функция?
Например max

SQL
1
SELECT DISTINCT MAX(EAS_Mess.dt), EASMess.mess

И обрати внимание на порядок следования столбцов в 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

T-SQL
1
2
3
4
SELECT EASMess.mess, count (EASMess.mess), max(EAS_Mess.dt)
From [...]
Where [...]
Group by EASMess.mess



1



nukanaka

0 / 0 / 0

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

Сообщений: 10

19.12.2011, 14:45

 [ТС]

16

сделал вот так:

SQL
1
2
3
4
5
SELECT EAS_Mess.mess, COUNT (EAS_Mess.mess)/2 AS COUNT, MAX(EAS_Mess.dt) AS last_dt
FROM EAS_Mess, EAS_IdMess
WHERE EAS_Mess.mess=EAS_IdMess.idm 
AND (dt >= '20100915 10:00' AND dt <= '20111219 09:00')
GROUP BY EAS_Mess.mess

Все работает как надо!
только почему-то счетчик пришлось делить на 2, иначе считает сообщения дважды)
СПАСИБО!



0



homich77

81 / 80 / 4

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

Сообщений: 326

19.12.2011, 18:56

17

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

AND (dt >= ‘20100915 10:00’ AND dt <= ‘20111219 09:00’)

не проще сделать через between?

Добавлено через 1 минуту

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

FROM EAS_Mess, EAS_IdMess
WHERE EAS_Mess.mess=EAS_IdMess.idm

а здесь лучше сделать через inner join:

SQL
1
2
...
FROM EAS_Mess INNER JOIN EAS_IdMess ON EAS_Mess.mess=EAS_IdMess.idm

Добавлено через 2 минуты

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

только почему-то счетчик пришлось делить на 2, иначе считает сообщения дважды)

не очень понятно Аааа.. понятно ) Сделайте пожалуйста через inner join и ответьте — сомневаюсь что будет также нужно деление на 2. Потому что перечисление в FROM через запятую означает декартово произведение, если я не ошибаюсь



0



nukanaka

0 / 0 / 0

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

Сообщений: 10

11.01.2012, 10:47

 [ТС]

18

При таком запросе все равно выдает значения в два раза больше чем реальные:

SQL
1
2
3
4
SELECT DISTINCT EAS_IdMess.mess, COUNT (EAS_Mess.mess) AS dtconf, MAX(EAS_Mess.dt) AS dt 
FROM EAS_Mess INNER JOIN EAS_IdMess ON EAS_Mess.mess=EAS_IdMess.idm
AND (EAS_Mess.dt BETWEEN '20100915 10:00' AND '20111219 09:00')
GROUP BY EAS_IdMess.mess



0



Devil_FoX

168 / 142 / 1

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

Сообщений: 474

11.01.2012, 19:56

19

nukanaka, а проверь ка табл. EAS_Mess и EAS_IdMess на задвоенния.

T-SQL
1
2
3
4
5
6
7
8
9
select
    EAS_Mess.mess,
    EAS_Mess.dt,
    count(*) as N
from EAS_Mess
group by
    EAS_Mess.mess,
    EAS_Mess.dt
having count(*)>1



0



nukanaka

0 / 0 / 0

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

Сообщений: 10

12.01.2012, 08:53

 [ТС]

20

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

nukanaka, а проверь ка табл. EAS_Mess и EAS_IdMess на задвоенния.

T-SQL
1
2
3
4
5
6
7
8
9
select
    EAS_Mess.mess,
    EAS_Mess.dt,
    count(*) as N
from EAS_Mess
group by
    EAS_Mess.mess,
    EAS_Mess.dt
having count(*)>1

проверил этим запросом, в ответ пустота, решил проблему вот таким образом:

T-SQL
1
2
3
4
SELECT DISTINCT EAS_IdMess.mess, COUNT (EAS_Mess.mess)/2 AS dtconf, MAX(EAS_Mess.dt) AS dt 
FROM EAS_Mess INNER JOIN EAS_IdMess ON EAS_Mess.mess=EAS_IdMess.idm
AND (EAS_Mess.dt BETWEEN '20100915 10:00' AND '20111219 09:00')
GROUP BY EAS_IdMess.mess



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

Как исправить ошибку «Столбец недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY» - Направляющие

Как исправить ошибку «Столбец недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP 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».

Понравилась статья? Поделить с друзьями:
  • Ошибка 812 при подключении к vpn windows 7
  • Ошибка 81110013 не удалось загрузить игровой профиль
  • Ошибка 8111000f аккаунт заморожен
  • Ошибка 8111000d не удалось восстановить 3d устройство
  • Ошибка 80190001 windows 10