Главная страница
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.028 c
15-1150289277
Сергей М.
2006-06-14 16:47
2006.07.16
Взаимодействие дивайса под управлением Linux с Win-клиентом


15-1150280183
начинающий
2006-06-14 14:16
2006.07.16
Clipboard via COM


2-1151583575
Ega23
2006-06-29 16:19
2006.07.16
Как получить список всех созданных фреймов приложения?


15-1150562389
Lertq
2006-06-17 20:39
2006.07.16
Найти путь наибольшей (наименьшей) стоимости!


6-1141982670
vlv
2006-03-10 12:24
2006.07.16
Связь WebModule с TServerSocket