Текущий архив: 2006.07.16;
Скачать: CL | DM;
ВнизПомогите составить запрос Найти похожие ветки
← →
p_evghenii (2006-05-16 16:03) [0]Есть две таблицы:
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
Заранее спасибо
← →
Sergey13 © (2006-05-16 16:07) [1]Попробуй так
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
← →
Johnmen © (2006-05-16 16:09) [2]SUM(CASE o.PRICE WHEN o.STATE=0 THEN o.PRICE ELSE 0 END)
Вообще говоря, документация рулит, как здесь принято говорить...
← →
p_evghenii (2006-05-16 16:15) [3]2 (1) - Такое не подходит, т.к. он возвращает только те client_id, у которых есть записи в orders со state=0 и state=1. Если какого-то state нет, то он эти записи не возвращает.
2 (2) - Это вообще не выполняется
← →
Sergey13 © (2006-05-16 16:19) [4]2[3] p_evghenii (16.05.06 16:15)
Переделай связь через JOIN
← →
p_evghenii (2006-05-16 16:46) [5]Если бы я знал как...
← →
Johnmen © (2006-05-16 16:58) [6]
> 2 (2) - Это вообще не выполняется
А ты не копи-пастом занимайся, а смотри синтаксис конструкции CASE ...
← →
p_evghenii (2006-05-16 17:13) [7]Да, спасибо, так может сработать. Одно НО: если с SUM все понятно, то как быть с COUNT - ведь он считает все подряд, независимо от того, какие значения мы поставим в CASE.
← →
Johnmen © (2006-05-16 17:50) [8]Замени на SUM(CASE ... 1 ...0 ...)
← →
ЮЮ © (2006-05-17 10:21) [9]
> 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 подзапроса
Страницы: 1 вся ветка
Текущий архив: 2006.07.16;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.008 c