![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите составить запрос [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