![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выражения в агрегатных функциях [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. Как ты думаешь, здесь телепаты собрались ? Или всё-таки вместо "не работает" стоит написать как именно не работает ?