![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
group by по многим полям или агрегаты
jack128_ © (2008-04-13 22:29:00)День добрый.
например такая табличка
MyTable(ID, CAPTION, MYPARAM)
есть два запроса, дающих одинаковый результат
select CAPTION, sum(MYPARAM)
from MYTABLE
group by ID, CAPTION
и
select max(CAPTION), sum(MYPARAM)
from MYTABLE
group by ID
есть ли какие нить соображения, _общие для всех распростронённых субд_, какой их этих запросов выбрать
kaif (2008-04-15 03:28:00) [1]Это разные запросы и в общем случае они дадут разные результаты.
Если они дают одинаковые результаты, то это лишь означает, что база данных плохо нормализована.
Вместо этой одной таблицы должно быть две:
TABLE1 (ID, CAPTION)
и
TABLE2(ID, TABLE1_ID, MYPARAM)
с отношением один ко многим.
И правильный запрос выглядел бы так:
SELECT T1.ID, T1.CAPTION, SUM(T2.MYPARAM)
FROM TABLE1 T1, TABLE2 T2
WHERE T1.ID = T2.TABLE1_ID
GROUP BY T1.ID, T1.CAPTION
или так:
SELECT T1.CAPTION, SUM(T2.MYPARAM)
FROM TABLE1 T1, TABLE2 T2
WHERE T1.ID = T2.TABLE1_ID
GROUP BY T1.CAPTION
Причем в первой таблице я бы предусмотрел кроме CONSTRAINT UNIQUE(CAPTION), а во второй - CONSTRAINT FOREIGN KEY (TABLE1_ID) REFERENCES TABLE1(ID)
Petr V. Abramov (2008-04-14 23:35:00) [2]
> jack128_ (14.04.08 09:52) [10]
какая разница, PK ID или нет.
главное, однозначно ли соотв. ID CAPTION`у
MsGuns (2008-04-14 16:58:00) [3]Наверно, я чего-то не понял, но о каких ИД идет речь в АГРЕГАТНЫХ запросах ?
Павел Калугин (2008-04-14 12:07:00) [4]
> jack128_ (13.04.08 22:29)
понятно откуда уши растут :)
Очень сильно завимсит от стркуктуры данных
Если одному ID соoтdетствует только один Caption и в результате запроса надо и то и другое то и группировать по обоим полям
ибо через месяц не поймешть зачем там макс.
Если одному ID соответствует несколько Caption то, имхо, это уже надо логически обосновывать что там - мин макс или группа
Второй пример ближе к телу и опять когда читаешь результат долго думаешь - засчем предидущий оратор взял максимальное из одного
вот пример
| подразделение | должность | оклад | месяц
---------------------------------------------------------------
|отдел автоматизации | начальник отдела | 100 | 1
|отдел автоматизации | начальник отдела | 100 | 2
|отдел автоматизации | начальник отдела | 100 | 3
|отдел автоматизации | начальник отдела | 100 | 4
|отдел автоматизации | начальник отдела | 100 | 5
|Отдел продаж | начальник отдела | 100 | 3
|Отдел продаж | начальник отдела | 100 | 4
|Отдел продаж | начальник отдела | 100 | 5
в отчете надо
по подразделению по должности суммарный оклад
можно написать
select подразделение, должность, sum(оклад)
...
group by подразделение, должность
а можно и
select подразделение, max(должность), sum(оклад)
...
group by подразделение, должность
и на приведенных данныхрезультат будет одинаковый.
Но толькона приведенных данных.
И разгибай потом почему в отделе зарплату получала только уборщица
Поэтому с максами (как и с минами) по текстам надо быть предельно аккуратным и с точки зрения дальнейшего сопровождения и понимания написанного.
Не знаю ка кэто сказывается на быстродействии. Но на понимании того, что в запросе написано - мое мнение - лишние функции они лишние. мешают.
Anatoly Podgoretsky (2008-04-14 11:02:00) [5]> jack128_ (14.04.2008 10:26:13) [13]
Это уде другое дель, здесь есть смысл.
O.Caption это название клиента или организации? или что то другое?
Вообще то у меня предчувстие о неправильной организации БД, хотя бы их за имен.
Но и все равно, в группировке o.ID лишний поскольку o.CAPTION обязан быть уникален, иначе смотри Johnmen © (14.04.2008 10:50) [14]
jack128_ (2008-04-14 10:57:00) [6]как вводят - так и различает. хз, на самом деле. реально, там еще туча полей выводится, как то по совокупности, наверное. еще есть иерархич. структура, по токой эти организации забиты, может по положению в этой структуре..
Ega23 (2008-04-14 10:54:00) [7]
> > Если да, то получается, что разные сущности с одинаковым
> > именем???
>
> да, у нас такое бывает.
>
Не давать ввести пользователю имя существующей сущности. Иначе граблей огрести можно - мама не горюй.
Johnmen (2008-04-14 10:50:00) [8]
> да, у нас такое бывает.
Как же их юзер различает?
jack128_ (2008-04-14 10:26:00) [9]
> Раз существует группировка по ИД, то смысла в ней нет, поскольку
> нет одинаковых ИД
ну да. тут я ошибся. Не коректный пример -(
ORGS (ID, CAPTION) - ID - PK
SALES (ID, ORGID, PRICE, ...)
select o.CAPTION, sum(s.PRICE)
from SALES
join ORGS o on o.ID = s.ORGID
group by o.ID, o.CAPTION
> Если да, то получается, что разные сущности с одинаковым
> именем???
да, у нас такое бывает.
Anatoly Podgoretsky (2008-04-14 10:04:00) [10]> jack128_ (14.04.2008 09:52:10) [10]
Раз существует группировка по ИД, то смысла в ней нет, поскольку нет одинаковых ИД
Johnmen (2008-04-14 09:59:00) [11]
> jack128_ (14.04.08 09:52) [10]
А CAPTION может повторяться для разных ID?
Если нет, то GROUP BY CAPTION.
Если да, то получается, что разные сущности с одинаковым именем???
jack128_ (2008-04-14 09:52:00) [12]
> если ты уверен, что результат обоих запросов эквивалентен
> для юзеров - то 2-й.
да, уверен. ID - это PK. Сенкс.
Petr V. Abramov (2008-04-14 01:21:00) [13]это два принципиально разных запроса.
Второй лучше для СУБД, потому что требует в разы меньше памяти под сортировку
> для всех распростронённых субд_,
если ты уверен, что результат обоих запросов эквивалентен для юзеров - то 2-й.
Но внимательно прочитай
http://ag-orlov.narod.ru/itnotes.htm#001
Главу "Вы согласились" раздел "В. Научитесь" пример про магазины
Anatoly Podgoretsky (2008-04-14 00:49:00) [14]Хотя нужен ответ какой результат должен быть в данном случае
3 'три' 3
3 'три' 4
3 'два' 3
7 или 10
По первому варианту будет
> 3 'три' 7
> 3 'два' 3
по второму
> 3 'три' 7
Anatoly Podgoretsky (2008-04-14 00:44:00) [15]А если серьезно, тогда только первый запрос
Anatoly Podgoretsky (2008-04-14 00:41:00) [16]> sniknik (14.04.2008 00:21:05) [5]
Ну иак не честно :-)
sniknik (2008-04-14 00:21:00) [17]> иначе результаты не могут быть одинаковыми.
еще если каждый ID строго соответствует CAPTION-у, пусть и повторяются (одно "аватар" другого). типа
ID CAPTION MYPARAM
2 'два' 1
2 'два' 2
3 'три' 3
3 'три' 4
3 'три' 3
Anatoly Podgoretsky (2008-04-14 00:10:00) [18]
> есть два запроса, дающих одинаковый результат
Это означает, что у тебя уникальный ИД, иначе результаты не могут быть одинаковыми.
sniknik (2008-04-13 23:13:00) [19]общие соображения - если для твоих целей запросы равнозначны (дают одинаковый результат) выбирай тот который работает быстрее (под тем sql сервером который предполагается чаще использовать).
Johnmen (2008-04-13 23:02:00) [20]Соображение простое - писать просто и ясно то, что надо получить.
Данные примеры не тождественны, и то, что результат одинаков - лишь частный случай.
Для ответа необходимо исчерпывающе знать, что есть ID и CAPTION. В вопросе это умалчивается.