Запрос с группировкой

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
FrOdO

Запрос с группировкой

Сообщение FrOdO » 23 дек 2004, 17:34

Hi ALL.
Есть проблема с составление запроса. Ниже приведен запрос, который я писал для MySQL.
----
select
clients.name as client_name,
clients.firm as firm,
sum(cost) as summary
from
stat, clients
where
clients.id = stat.id_client
group by
id_client
order by firm, name

---

Он считает сумму по клиентам, используя группировку по идентификатору клиента (id_client). В результате он выдает сумму, имя клиента и фирму.

При переходе на Firebird 1.5 данный запрос не работает. И никак не могу сделать аналогичную вещь, скоро матом буду крыть IB.

Вот ошибка:

Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).

Очень прошу помочь.
Заранее благодарю за ответы.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 23 дек 2004, 17:54

совершенно верно матерится, group by должен быть по выбираемым неагрегированным столбцам. Т.е. данный запрос неверен абсолютно, и это проблема MySQL.
Надо так:

Код: Выделить всё

select c.name, c.firm, sum(cost)
from stat s, clients c
where c.id = s.id_client
group by c.name, c.firm
order by firm, name
кстати - зачем лепить as для столбцов, кому это надо? в гриде все равно русские имена столбцов надо менять, хоть у TField.DisplayName, хоть в самом столбце грида.

чтобы ускорить, если name+firm всегда уникально, можно написать

Код: Выделить всё

select c.name, max(c.firm), sum(cost)
group by c.name
кстати. чей столбец cost? нехорошо неуказывать алиас таблицы при джойне более двух столбцов. мало ли, вдруг и у clients такой столбец окажется.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 23 дек 2004, 18:02

kdv писал(а): Надо так:

Код: Выделить всё

select c.name, c.firm, sum(cost)
from stat s, clients c
where c.id = s.id_client
group by c.name, c.firm
order by firm, name
...

кстати. чей столбец cost? нехорошо неуказывать алиас таблицы при джойне более двух столбцов. мало ли, вдруг и у clients такой столбец окажется.
В ордер бу их не указывать тоже нехорошо :-D

fraks
Сообщения: 12
Зарегистрирован: 03 дек 2004, 15:41

Сообщение fraks » 24 дек 2004, 08:12

kdv писал(а):кстати - зачем лепить as для столбцов, кому это надо?
Это надо когда выбирается несколько полей с одинаковыми именами. Если не сделать as то получатся какие-нибудь name, name2, name3 что иногда очень сильно мешает т.к. порядок нумерации не стабилен при изменении запроса.

Кстати, по русским именам - в FB сработает и такое:

Код: Выделить всё

select name as 'Наименование'.

FrOdO

Спасибо

Сообщение FrOdO » 24 дек 2004, 08:54

Всем спасибо, помогло.
Видно MySQL более неприхотлив к конструкции select'а

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 24 дек 2004, 10:13

раньше IB/FB тоже всякую гадость кушал. теперь стал более разборчив. это же все зависит от парсера - парсер может допускать некорректные конструкции SQL. Соответственно ядро будет выдавать неизвестно какой результат.

посмотри http://www.ibase.ru/ibo/n7.htm от 27.08.2001, там пример есть. это только один случай, а их масса.

Ответить