Форум: "Базы";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
ВнизВыражения в агрегатных функциях Найти похожие ветки
← →
Nimfa © (2005-06-12 14:44) [0]Помогите посчитать в таблице REG(Client, Tp, Vid) с помощью запроса сумму по полю TP, где Vid = ‘ТТ’ и в другом поле запроса сумму по полю TP, где Vid = ‘TNP’. Group by по полю Client.
Пробовала писать: sum(case where Vid = "TT" then TP else 0 end) -не работает.
← →
Zacho © (2005-06-12 20:06) [1]1. В IB нет case. Да для этой цели и не нужно.
2. RTFM WHERE
P.S. Как ты думаешь, здесь телепаты собрались ? Или всё-таки вместо "не работает" стоит написать как именно не работает ?
← →
Nimfa © (2005-06-13 11:47) [2]Ну раз case в IB нет, то и ошибка очевидна: Invalid keyword. Token:when. Тогда почему when, а не case?
И можно по подробней про "RTFM WHERE"?
← →
Zacho © (2005-06-13 11:53) [3]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
← →
Anatoly Podgoretsky © (2005-06-13 12:00) [4]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 12:09) [5]Извеняюсь, был не прав, невнимательно прочитал вопрос,
← →
Zacho © (2005-06-13 12:24) [6]Вот решения:
1. Для IB 6.xselect 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.5SELECT
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
← →
Anatoly Podgoretsky © (2005-06-13 12:32) [7]Не завидую, для первого будет декартово произведение, для второго полное сканирование таблицы, ты правда тут ни причем :-)
Не знаю задачи, но если допустимо, то два независимых запроса с отдельными датасет, при желании результат куда ни будь, в массив, в ClientDataSet и т.д.
← →
Zacho © (2005-06-13 15:45) [8]Anatoly Podgoretsky © (13.06.05 12:32) [7]
Не завидую, для первого будет декартово произведение
Где ??? Или под "декартовым произведением" я понимаю что-то другое ?
> для второго полное сканирование таблицы
Возможно. А может и нет. Я не знаю, как работает оптимизатор FB 1.5
А, вообще, согласен, запрос будет довольно медленный в обоих случаях. Я бы сделал двумя запросами или ХП.
← →
Anatoly Podgoretsky © (2005-06-13 15:57) [9]Для каждого R.CLIENT будет вызывать подзапрос, точнее даже два.
По второму случаю придется просмотреть всю таблицу, поскольку во WHERE не удастся включить два независимых условия.
← →
Zacho © (2005-06-13 16:18) [10]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 16:31) [11]Декартово, в смысле что будет Client*Client расчетов, а не Client*Client записей
← →
Zacho © (2005-06-13 16:36) [12]Anatoly Podgoretsky © (13.06.05 16:31) [11]
Это да, сразу не понял, был (и есть) несколько нетрезв :)
← →
Anatoly Podgoretsky © (2005-06-13 17:03) [13]С празником :-)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c