Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выражения в агрегатных функциях [D6, IB6.x]


Nimfa ©   (2005-06-12 14:44:00) 

Помогите посчитать в таблице REG(Client, Tp, Vid) с помощью запроса сумму по полю TP, где Vid = ‘ТТ’ и в другом поле запроса сумму по полю TP, где Vid = ‘TNP’. Group by по полю Client.
Пробовала писать: sum(case where Vid = "TT" then TP else 0 end) -не работает.


Anatoly Podgoretsky   (2005-06-13 17:03:00) [1]

С празником :-)


Zacho   (2005-06-13 16:36:00) [2]

Anatoly Podgoretsky ©   (13.06.05 16:31) [11]

Это да, сразу не понял, был (и есть) несколько нетрезв :)


Anatoly Podgoretsky   (2005-06-13 16:31:00) [3]

Декартово, в смысле что будет Client*Client расчетов, а не Client*Client записей


Zacho   (2005-06-13 16:18:00) [4]

Anatoly Podgoretsky ©   (13.06.05 15:57) [9]
Для каждого R.CLIENT будет вызывать подзапрос, точнее даже два.


Естествнно, но это не декартово произведение, это аналог внешнего соединения трёх таблиц. Кстати, этот запрос вполне можно написать с LEFT JOIN.

Anatoly Podgoretsky ©   (13.06.05 15:57) [9]
По второму случаю придется просмотреть всю таблицу


Скорее всего именно так. Согласен.
Но точно не знаю, и проверить сейчас не могу :)


Anatoly Podgoretsky   (2005-06-13 15:57:00) [5]

Для каждого R.CLIENT будет вызывать подзапрос, точнее даже два.

По второму случаю придется просмотреть всю таблицу, поскольку во WHERE не удастся включить два независимых условия.


Zacho   (2005-06-13 15:45:00) [6]

Anatoly Podgoretsky ©   (13.06.05 12:32) [7]
Не завидую, для первого будет декартово произведение


Где ??? Или под "декартовым произведением" я понимаю что-то другое ?

> для второго полное сканирование таблицы

Возможно. А может и нет. Я не знаю, как работает оптимизатор FB 1.5

А, вообще, согласен, запрос будет довольно медленный в обоих случаях. Я бы сделал двумя запросами или ХП.


Anatoly Podgoretsky   (2005-06-13 12:32:00) [7]

Не завидую, для первого будет декартово произведение, для второго полное сканирование таблицы, ты правда тут ни причем :-)
Не знаю задачи, но если допустимо, то два независимых запроса с отдельными датасет, при желании результат куда ни будь, в массив, в ClientDataSet и т.д.


Zacho   (2005-06-13 12:24:00) [8]

Вот решения:
1. Для IB 6.x

select distinct R.CLIENT,
(SELECT SUM(R2.TP) FROM REG R2 WHERE R2.CLIENT=R.CLIENT and R2.VID='TT'),
(SELECT SUM(R3.TP) FROM REG R3 WHERE R3.CLIENT=R.CLIENT and R3.VID='TNP')
FROM REG R


2. Для FB 1.5

SELECT
 R.CLIENT,
 SUM(CASE R.VID WHEN 'TT' THEN R.TP ELSE 0 END),
 SUM(CASE R.VID WHEN 'TNP' THEN R.TP ELSE 0 END)
FROM REG R
GROUP BY R.client


Zacho   (2005-06-13 12:09:00) [9]

Извеняюсь, был не прав, невнимательно прочитал вопрос,


Anatoly Podgoretsky   (2005-06-13 12:00:00) [10]

Zacho ©   (13.06.05 11:53) [3]
Гыы, так она же хочет
SELECT SUM(TP WHERE VID='TT') as S1,  SUM(TP WHERE VID='TNP')  as S2 FROM REG GROUP BY CLIENT


Zacho   (2005-06-13 11:53:00) [11]

Nimfa ©   (13.06.05 11:47) [2]
то и ошибка очевидна:


Это ещё не повод, что бы её не приводить. А вдруг ситуация была бы не такой очевидной ?
Кстати, case есть в FB 1.5

Nimfa ©   (13.06.05 11:47) [2]
И можно по подробней про "RTFM WHERE"?


Насколько я понял твой вопрос, никакие case тебе не нужны, а нужен простой запрос:

SELECT SUM(TP) FROM REG WHERE VID='TT' GROUP BY CLIENT


Nimfa   (2005-06-13 11:47:00) [12]

Ну раз case в IB нет, то и ошибка очевидна: Invalid keyword. Token:when. Тогда почему when, а не case?
И можно по подробней про "RTFM WHERE"?


Zacho   (2005-06-12 20:06:00) [13]

1. В IB нет case. Да для этой цели и не нужно.
2. RTFM WHERE

P.S. Как ты думаешь, здесь телепаты собрались ? Или всё-таки вместо "не работает" стоит написать как именно не работает ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо