Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.012 c
15-1219737191
Bless
2008-08-26 11:53
2008.10.19
Какова вероятность...


2-1221127435
mefodiy
2008-09-11 14:03
2008.10.19
Черно-белая печать на цветном принтере


15-1220135516
Eraser
2008-08-31 02:31
2008.10.19
Системный микшер и виста + Delphi


15-1220006168
Prohodil Mimo
2008-08-29 14:36
2008.10.19
JavaScript


2-1220780338
Point
2008-09-07 13:38
2008.10.19
Как научиться составлять sql запросы.