Главная страница
    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.043 c
2-1151408939
Delphi basic
2006-06-27 15:48
2006.07.16
DBDate


6-1142241569
Alex_Delphi
2006-03-13 12:19
2006.07.16
Кто нибуть может подсказать как отсканировать порты в сети


15-1150460667
Удалено_модератором
2006-06-16 16:24
2006.07.16
Роль модератора на форуме?


2-1151670783
Ivolg
2006-06-30 16:33
2006.07.16
ListView ?


2-1151260756
rus0303
2006-06-25 22:39
2006.07.16
использование индекса





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский