Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / GROUP BY работает как фильтр / 16 сообщений из 16, страница 1 из 1
10.10.2014, 18:30
    #38773667
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY работает как фильтр
Столкнулся с интересным поведением 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
10.10.2014, 18:38
    #38773675
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY работает как фильтр
http://msdn.microsoft.com/ru-ru/library/ms177673(v=sql.100).aspx Строки, которые не соответствуют условиям в предложении WHERE,
удаляются до выполнения любых операций группирования.
...
Рейтинг: 0 / 0
10.10.2014, 18:40
    #38773678
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY работает как фильтр
Все логично.

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

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

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

Вы пробовали выполнять код из примера?Пробовали. А вы пробовали понять, что я ответил?
...
Рейтинг: 0 / 0
10.10.2014, 19:32
    #38773738
Shakill
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY работает как фильтр
кстати, этот прием может пригодиться при выборке единственного значения из набора, когда надо сбрасывать переменную в 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
10.10.2014, 19:56
    #38773742
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY работает как фильтр
Гавриленко Сергей Алексеевич,

Разумеется, до сих пор пытаюсь. Кажется, даже начало получаться. Спасибо.
...
Рейтинг: 0 / 0
10.10.2014, 20:11
    #38773748
a_voronin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY работает как фильтр
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
10.10.2014, 20:31
    #38773773
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY работает как фильтр
Ennor Tiegaeliap, Гавриленко Сергей Алексеевич,

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

Вы пробовали выполнять код из примера?Да!Пытался найти что-то подходящее в документации.
Помню, на форуме были обсуждения в какой-то теме применительно к COUNT(*).
Если GROUP BY есть, то для пустого DataSet не возвращается ни одной строки,
а если нет, то возвращается 0.
Но я чего-то эту тему быстро не нашёл.
...
Рейтинг: 0 / 0
10.10.2014, 22:16
    #38773814
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY работает как фильтр
Это называется "скалярные агрегаты"
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
11.10.2014, 10:07
    #38773934
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GROUP BY работает как фильтр
invm,

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

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


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