Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.03 c
6-1142003887
viman
2006-03-10 18:18
2006.07.16
Winsock 2, Win98(WinME) и UDP, как отправить свой заголовок?


6-1141329303
Aven
2006-03-02 22:55
2006.07.16
Сокеты без окон


15-1150406602
Ломброзо
2006-06-16 01:23
2006.07.16
Коэффициенты пересчёта


2-1151503487
novill
2006-06-28 18:04
2006.07.16
Почему из сервиса(службы) с админскими правами не могу выключить


1-1149082572
adalx
2006-05-31 17:36
2006.07.16
Компоненты