Конференция "Базы" » group by по многим полям или агрегаты
 
  • jack128_ (13.04.08 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



    есть ли какие нить соображения, _общие для всех распростронённых субд_, какой их этих запросов выбрать
  • Игорь Шевченко © (13.04.08 22:54) [1]

    > есть ли какие нить соображения, _общие для всех распростронённых
    > субд_, какой их этих запросов выбрать


    Смотря что надо получить

    Запросы разные, результаты в общем случае тоже будут разные.
  • Johnmen © (13.04.08 23:02) [2]
    Соображение простое - писать просто и ясно то, что надо получить.
    Данные примеры не тождественны, и то, что результат одинаков - лишь частный случай.
    Для ответа необходимо исчерпывающе знать, что есть ID и CAPTION. В вопросе это умалчивается.
  • sniknik © (13.04.08 23:13) [3]
    общие соображения - если для твоих целей запросы равнозначны (дают одинаковый результат) выбирай тот который работает быстрее (под тем sql сервером который предполагается чаще использовать).
  • Anatoly Podgoretsky © (14.04.08 00:10) [4]

    > есть два запроса, дающих одинаковый результат

    Это означает, что у тебя уникальный ИД, иначе результаты не могут быть одинаковыми.
  • sniknik © (14.04.08 00:21) [5]
    > иначе результаты не могут быть одинаковыми.
    еще если каждый ID строго соответствует CAPTION-у, пусть и повторяются (одно "аватар" другого). типа
    ID CAPTION MYPARAM
    2  'два'        1
    2  'два'        2
    3  'три'        3
    3  'три'        4
    3  'три'        3
  • Anatoly Podgoretsky © (14.04.08 00:41) [6]
    > sniknik  (14.04.2008 00:21:05)  [5]

    Ну иак не честно :-)
  • Anatoly Podgoretsky © (14.04.08 00:44) [7]
    А если серьезно, тогда только первый запрос
  • Anatoly Podgoretsky © (14.04.08 00:49) [8]
    Хотя нужен ответ какой результат должен быть в данном случае

    3  'три'        3
    3  'три'        4
    3  'два'        3

    7 или 10
    По первому варианту будет

    > 3  'три'        7
    > 3  'два'        3


    по второму

    > 3  'три'        7
  • Petr V. Abramov © (14.04.08 01:21) [9]
    это два принципиально разных запроса.
    Второй лучше для СУБД, потому что требует в разы меньше памяти под сортировку
    > для всех распростронённых субд_,

    если ты уверен, что результат обоих запросов эквивалентен для юзеров - то 2-й.

    Но внимательно прочитай
    http://ag-orlov.narod.ru/itnotes.htm#001
    Главу "Вы согласились" раздел "В. Научитесь" пример про магазины
  • jack128_ (14.04.08 09:52) [10]

    > если ты уверен, что результат обоих запросов эквивалентен
    > для юзеров - то 2-й.

    да, уверен. ID - это PK.  Сенкс.
  • Johnmen © (14.04.08 09:59) [11]

    > jack128_   (14.04.08 09:52) [10]

    А CAPTION может повторяться для разных ID?
    Если нет, то GROUP BY CAPTION.
    Если да, то получается, что разные сущности с одинаковым именем???
  • Anatoly Podgoretsky © (14.04.08 10:04) [12]
    > jack128_  (14.04.2008 09:52:10)  [10]

    Раз существует группировка по ИД, то смысла в ней нет, поскольку нет одинаковых ИД
  • jack128_ (14.04.08 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 © (14.04.08 10:50) [14]

    > да, у нас такое бывает.

    Как же их юзер различает?
  • Ega23 © (14.04.08 10:54) [15]

    > > Если да, то получается, что разные сущности с одинаковым
    > > именем???
    >
    > да, у нас такое бывает.
    >


    Не давать ввести пользователю имя существующей сущности. Иначе граблей огрести можно - мама не горюй.
  • jack128_ (14.04.08 10:57) [16]
    как вводят - так и различает. хз, на самом деле. реально, там еще туча полей выводится, как то по совокупности, наверное. еще есть иерархич. структура, по токой эти организации забиты, может по положению в этой структуре..
  • Anatoly Podgoretsky © (14.04.08 11:02) [17]
    > jack128_  (14.04.2008 10:26:13)  [13]

    Это уде другое дель, здесь есть смысл.
    O.Caption это название клиента или организации? или что то другое?
    Вообще то у меня предчувстие о неправильной организации БД, хотя бы их за имен.
    Но и все равно, в группировке o.ID лишний поскольку o.CAPTION обязан быть уникален, иначе смотри Johnmen © (14.04.2008 10:50) [14]
  • Павел Калугин © (14.04.08 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 © (14.04.08 16:58) [19]
    Наверно, я чего-то не понял, но о каких ИД идет речь в АГРЕГАТНЫХ запросах ?
  • Petr V. Abramov © (14.04.08 23:35) [20]

    > jack128_   (14.04.08 09:52) [10]

    какая разница, PK ID или нет.
    главное, однозначно ли соотв. ID CAPTION`у
  • kaif © (15.04.08 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)
 
Конференция "Базы" » group by по многим полям или агрегаты
Есть новые Нет новых   [134432   +20][b:0][p:0.002]