Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.07.16;
Скачать: [xml.tar.bz2];

Вниз

Помогите составить запрос   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.008 c
1-1149158328
.ruslan
2006-06-01 14:38
2006.07.16
Цвет шрифта в столбце ListView


15-1150564169
TUser
2006-06-17 21:09
2006.07.16
Это сделали взрослые


2-1151680563
Loginov Dmitry
2006-06-30 19:16
2006.07.16
Выравнивание компонентов


2-1150819251
Windows
2006-06-20 20:00
2006.07.16
Таймер в консоли


6-1142003887
viman
2006-03-10 18:18
2006.07.16
Winsock 2, Win98(WinME) и UDP, как отправить свой заголовок?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский