powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / GROUP BY работает как фильтр
16 сообщений из 16, страница 1 из 1
GROUP BY работает как фильтр
    #38773667
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся с интересным поведением GROUP BY - раньше такого не замечал, хотя фича, похоже, не новая:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare @Sales table (
	Id int identity(1,1) primary key,
	CustomerId int not null,
	SaleDate datetime not null,
	Amount money not null
);

insert into @Sales (CustomerId, SaleDate, Amount)
values
	(1, '20100506 12:00', 280),
	(3, '20100607 12:00', 150);


select max(s.SaleDate) as [LastDate], sum(s.Amount) as [TotalAmount], count(*) as [Count]
from @Sales s
where s.CustomerId = 2;

select max(s.SaleDate) as [LastDate], sum(s.Amount) as [TotalAmount], count(*) as [Count]
from @Sales s
where s.CustomerId = 2
group by s.CustomerId;


Специально перечитал раздел справки по group by, но не нашел никаких упоминаний подобного поведения. Кто-нибудь в курсе, почему оно именно так работает?
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773675
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://msdn.microsoft.com/ru-ru/library/ms177673(v=sql.100).aspx Строки, которые не соответствуют условиям в предложении WHERE,
удаляются до выполнения любых операций группирования.
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773678
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все логично.

Группировка пустого набора всегда была пустым набором.
Но при этом на пустом наборе можно считать агрегаты по всему набору.
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773684
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас тут два запроса эквивалентных, которые возвращают один и тот же результат. Что за " GROUP BY работает как фильтр"?
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773685
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voroninУ вас тут два запроса эквивалентных, которые возвращают один и тот же результат.
Разные результаты - в одном есть запись, а в другом нет
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773688
tarrus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voroninУ вас тут два запроса эквивалентных, которые возвращают один и тот же результат. Что за " GROUP BY работает как фильтр"?

Совсем не эквивалентных. Результат разный.
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773697
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iap, Гавриленко Сергей Алексеевич,

Вы пробовали выполнять код из примера?
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773699
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor TiegaelВы пробовали выполнять код из примера?
Пробовали
Все просто
group by начнет вычисление агрегатов только при наличии групп
Т.е. нет групп - нет вызова агрегатов, нет вызова агрегатов - нет реузльтата
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773722
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegaeliap, Гавриленко Сергей Алексеевич,

Вы пробовали выполнять код из примера?Пробовали. А вы пробовали понять, что я ответил?
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773738
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, этот прием может пригодиться при выборке единственного значения из набора, когда надо сбрасывать переменную в NULL, если ничего не нашлось.

Код: sql
1.
2.
3.
4.
5.
6.
7.
declare @objname sysname = 'oldname'

select @objname = max(sy.name)
from sys.objects as sy
where sy.object_id = 500000

select @objname


хотя можно и просто set @objname = NULL перед выборкой :)
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773742
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

Разумеется, до сих пор пытаюсь. Кажется, даже начало получаться. Спасибо.
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773748
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor TiegaelГавриленко Сергей Алексеевич,

Разумеется, до сих пор пытаюсь. Кажется, даже начало получаться. Спасибо.

Если по делу, что может вам надо написать

Код: sql
1.
2.
3.
4.
SELECT ....
FROM Customers c
LEFT JOIN Sales s ON s.CustomerId = c.Customer_id 
GROUP BY c.Customer_id 
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773773
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegaeliap, Гавриленко Сергей Алексеевич,

Вы пробовали выполнять код из примера?Да!
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773777
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapEnnor Tiegaeliap, Гавриленко Сергей Алексеевич,

Вы пробовали выполнять код из примера?Да!Пытался найти что-то подходящее в документации.
Помню, на форуме были обсуждения в какой-то теме применительно к COUNT(*).
Если GROUP BY есть, то для пустого DataSet не возвращается ни одной строки,
а если нет, то возвращается 0.
Но я чего-то эту тему быстро не нашёл.
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773814
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это называется "скалярные агрегаты"
http://blogs.msdn.com/b/craigfr/archive/2006/09/06/743116.aspx In this post, I’m going to focus on “scalar aggregates.” Scalar aggregates are queries with aggregate functions in the select list and no GROUP BY clause. Scalar aggregates always return a single row.
...
Рейтинг: 0 / 0
GROUP BY работает как фильтр
    #38773934
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

То, что агрегаты возвращают одну строку, как раз ожидаемо. Неожиданной была ситуация, когда они перестают это делать. И вот об этом у Фридмана ни слова - он рассматривает более низкий, физический, уровень, а это в данном случае как раз иррелевантно (ибо неважно, будет это Stream или Hash Aggregate - результат запроса будет одинаковый).

Может, конечно, это всем настолько очевидно, что никто даже не видит смысла в упоминании такой возможности, и это только я один такой темный. Но, имхо, как минимум в справке стоило о такой возможности упомянуть. Простейший пример - апдейт таблицы агрегатом, получаемым из APPLY. В зависимости от формулировки, CROSS может внезапно превратиться в OUTER и наоборот.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / GROUP BY работает как фильтр
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]