Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2008.10.19;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.007 c
11-1194543607
Sinko
2007-11-08 20:40
2008.10.19
KOL CE + Lazarus +Иероглифы


11-1194295636
Elec3C
2007-11-05 23:47
2008.10.19
Вопрос по OpenSaveDialog у


2-1220964901
dmitry_12_08_73
2008-09-09 16:55
2008.10.19
После закрытия всех форм программа не пропадает в таскбаре


3-1208237063
saNat
2008-04-15 09:24
2008.10.19
Многопользовательский доступ к БД


1-1200566541
Layner
2008-01-17 13:42
2008.10.19
Можно ли из сервиса вызвать форму (для настройки это сервиса)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский