Текущий архив: 2008.10.19;
Скачать: CL | DM;
Внизgroup by по многим полям или агрегаты Найти похожие ветки
← →
jack128_ (2008-04-13 22:29) [0]День добрый.
например такая табличка
MyTable(ID, CAPTION, MYPARAM)
есть два запроса, дающих одинаковый результат
select CAPTION, sum(MYPARAM)
from MYTABLE
group by ID, CAPTION
и
select max(CAPTION), sum(MYPARAM)
from MYTABLE
group by ID
есть ли какие нить соображения, _общие для всех распростронённых субд_, какой их этих запросов выбрать
← →
Игорь Шевченко © (2008-04-13 22:54) [1]
> есть ли какие нить соображения, _общие для всех распростронённых
> субд_, какой их этих запросов выбрать
Смотря что надо получить
Запросы разные, результаты в общем случае тоже будут разные.
← →
Johnmen © (2008-04-13 23:02) [2]Соображение простое - писать просто и ясно то, что надо получить.
Данные примеры не тождественны, и то, что результат одинаков - лишь частный случай.
Для ответа необходимо исчерпывающе знать, что есть ID и CAPTION. В вопросе это умалчивается.
← →
sniknik © (2008-04-13 23:13) [3]общие соображения - если для твоих целей запросы равнозначны (дают одинаковый результат) выбирай тот который работает быстрее (под тем sql сервером который предполагается чаще использовать).
← →
Anatoly Podgoretsky © (2008-04-14 00:10) [4]
> есть два запроса, дающих одинаковый результат
Это означает, что у тебя уникальный ИД, иначе результаты не могут быть одинаковыми.
← →
sniknik © (2008-04-14 00:21) [5]> иначе результаты не могут быть одинаковыми.
еще если каждый ID строго соответствует CAPTION-у, пусть и повторяются (одно "аватар" другого). типа
ID CAPTION MYPARAM
2 "два" 1
2 "два" 2
3 "три" 3
3 "три" 4
3 "три" 3
← →
Anatoly Podgoretsky © (2008-04-14 00:41) [6]> sniknik (14.04.2008 00:21:05) [5]
Ну иак не честно :-)
← →
Anatoly Podgoretsky © (2008-04-14 00:44) [7]А если серьезно, тогда только первый запрос
← →
Anatoly Podgoretsky © (2008-04-14 00:49) [8]Хотя нужен ответ какой результат должен быть в данном случае
3 "три" 3
3 "три" 4
3 "два" 3
7 или 10
По первому варианту будет
> 3 "три" 7
> 3 "два" 3
по второму
> 3 "три" 7
← →
Petr V. Abramov © (2008-04-14 01:21) [9]это два принципиально разных запроса.
Второй лучше для СУБД, потому что требует в разы меньше памяти под сортировку
> для всех распростронённых субд_,
если ты уверен, что результат обоих запросов эквивалентен для юзеров - то 2-й.
Но внимательно прочитай
http://ag-orlov.narod.ru/itnotes.htm#001
Главу "Вы согласились" раздел "В. Научитесь" пример про магазины
← →
jack128_ (2008-04-14 09:52) [10]
> если ты уверен, что результат обоих запросов эквивалентен
> для юзеров - то 2-й.
да, уверен. ID - это PK. Сенкс.
← →
Johnmen © (2008-04-14 09:59) [11]
> jack128_ (14.04.08 09:52) [10]
А CAPTION может повторяться для разных ID?
Если нет, то GROUP BY CAPTION.
Если да, то получается, что разные сущности с одинаковым именем???
← →
Anatoly Podgoretsky © (2008-04-14 10:04) [12]> jack128_ (14.04.2008 09:52:10) [10]
Раз существует группировка по ИД, то смысла в ней нет, поскольку нет одинаковых ИД
← →
jack128_ (2008-04-14 10:26) [13]
> Раз существует группировка по ИД, то смысла в ней нет, поскольку
> нет одинаковых ИД
ну да. тут я ошибся. Не коректный пример -(
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
> Если да, то получается, что разные сущности с одинаковым
> именем???
да, у нас такое бывает.
← →
Johnmen © (2008-04-14 10:50) [14]
> да, у нас такое бывает.
Как же их юзер различает?
← →
Ega23 © (2008-04-14 10:54) [15]
> > Если да, то получается, что разные сущности с одинаковым
> > именем???
>
> да, у нас такое бывает.
>
Не давать ввести пользователю имя существующей сущности. Иначе граблей огрести можно - мама не горюй.
← →
jack128_ (2008-04-14 10:57) [16]как вводят - так и различает. хз, на самом деле. реально, там еще туча полей выводится, как то по совокупности, наверное. еще есть иерархич. структура, по токой эти организации забиты, может по положению в этой структуре..
← →
Anatoly Podgoretsky © (2008-04-14 11:02) [17]> jack128_ (14.04.2008 10:26:13) [13]
Это уде другое дель, здесь есть смысл.
O.Caption это название клиента или организации? или что то другое?
Вообще то у меня предчувстие о неправильной организации БД, хотя бы их за имен.
Но и все равно, в группировке o.ID лишний поскольку o.CAPTION обязан быть уникален, иначе смотри Johnmen © (14.04.2008 10:50) [14]
← →
Павел Калугин © (2008-04-14 12:07) [18]
> 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 подразделение, должность
и на приведенных данных результат будет одинаковый.
Но только на приведенных данных.
И разгибай потом почему в отделе зарплату получала только уборщица
Поэтому с максами (как и с минами) по текстам надо быть предельно аккуратным и с точки зрения дальнейшего сопровождения и понимания написанного.
Не знаю ка кэто сказывается на быстродействии. Но на понимании того, что в запросе написано - мое мнение - лишние функции они лишние. мешают.
← →
MsGuns © (2008-04-14 16:58) [19]Наверно, я чего-то не понял, но о каких ИД идет речь в АГРЕГАТНЫХ запросах ?
← →
Petr V. Abramov © (2008-04-14 23:35) [20]
> jack128_ (14.04.08 09:52) [10]
какая разница, PK ID или нет.
главное, однозначно ли соотв. ID CAPTION`у
← →
kaif © (2008-04-15 03:28) [21]Это разные запросы и в общем случае они дадут разные результаты.
Если они дают одинаковые результаты, то это лишь означает, что база данных плохо нормализована.
Вместо этой одной таблицы должно быть две:
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)
Страницы: 1 вся ветка
Текущий архив: 2008.10.19;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.005 c