Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите составить запрос [Firebird 2]


p_evghenii ©   (2006-05-16 16:03:00) 

Есть две таблицы:
CLIENT (ID, NAME)
ORDERS (ID, CLIENT_ID, STATE, PRICE)

Мне надо получить агрегированный запрос по полю PRICE, т.е. чтобы получалась такая выборка (пять колонок):
CLIENT_ID, Count(ORDERS.ID) когда STATE=0, Sum(PRICE) когда STATE=0, Count(ORDERS.ID) когда STATE=1, Sum(PRICE) когда STATE=1.

Пока могу получить только три колонки следующим запросом (как его модифицировать?):
SELECT cl.ID, COUNT(o.id), SUM(o.PRICE)
FROM client cl, orders o
WHERE (o.state=0) and (cl.id=o.client)
GROUP BY cl.ID

Заранее спасибо


ЮЮ   (2006-05-17 10:21:00) [1]


> FROM client cl, orders o1, orders o2


произойдет перемножение и суммы/количества будут неверными.
Тут, ИМХО, подойдет что-то типа (хотя и не люблю запросы в запросе):

SELECT
 cl.ID,
 (SELECT COUNT(o1.id), SUM(o1.PRICE) FROM orders o1 WHERE (cl.id=o1.client) and (o1.state=0)),
 (SELECT COUNT(o2.id), SUM(o2.PRICE) FROM orders o2 WHERE (cl.id=o2.client) and (o2.state=1))
FROM
 client cl

P.S. Синтаксис IB знаю поверхностно. Может быть и нельзя сразу 2 поля выбирать в подзапросе, тогда потребуется 4 подзапроса


Johnmen   (2006-05-16 17:50:00) [2]

Замени на SUM(CASE ... 1 ...0 ...)


p_evghenii   (2006-05-16 17:13:00) [3]

Да, спасибо, так может сработать. Одно НО: если с SUM все понятно, то как быть с COUNT - ведь он считает все подряд, независимо от того, какие значения мы поставим в CASE.


Johnmen   (2006-05-16 16:58:00) [4]


> 2 (2) - Это вообще не выполняется


А ты не копи-пастом занимайся, а смотри синтаксис конструкции CASE ...


p_evghenii   (2006-05-16 16:46:00) [5]

Если бы я знал как...


Sergey13   (2006-05-16 16:19:00) [6]

2[3] p_evghenii   (16.05.06 16:15)
Переделай связь через JOIN


p_evghenii   (2006-05-16 16:15:00) [7]

2 (1) - Такое не подходит, т.к. он возвращает только те client_id, у которых есть записи в orders со state=0 и state=1. Если какого-то state нет, то он эти записи не возвращает.

2 (2) - Это вообще не выполняется


Johnmen   (2006-05-16 16:09:00) [8]

SUM(CASE o.PRICE WHEN o.STATE=0 THEN o.PRICE ELSE 0 END)

Вообще говоря, документация рулит, как здесь принято говорить...


Sergey13   (2006-05-16 16:07:00) [9]

Попробуй так
SELECT cl.ID, COUNT(o1.id), SUM(o1.PRICE), COUNT(o2.id), SUM(o2.PRICE)
FROM client cl, orders o1, orders o2
WHERE (cl.id=o1.client) and (o1.state=0) and (cl.id=o2.client) and (o2.state=1)
GROUP BY cl.ID


Наверх

Титульная страница Поиск, карта сайта Написать письмо