Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

group by по многим полям или агрегаты


Страницы:   1 2

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. В вопросе это умалчивается.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо