Форум: "Базы";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];
ВнизЗапрос SQL Найти похожие ветки
← →
elektro (2002-08-26 14:58) [0]Есть таблицы:
ТЕЛЕФОНЫ(НОМЕР, ФИО)
АВТОМАТИКА(ПОРЯДКОВЫЙ_НОМЕР, НОМЕР, ДАТА, ДЕНЬГИ)
ПЛАТЕЖИ(ПОРЯДКОВЫЙ_НОМЕР, НОМЕР, ДАТА, ДЕНЬГИ)
Требуется выдать по заданному интервалу номеров телефонов и дат выдать по каждому номеру сумму автоматики и платежей:
НОМЕР_1, СУММА_АВТОМАТИКИ, СУММА_ПЛАТЕЖЕЙ
..........
НОМЕР_ПОСЛЕДНИЙ, СУММА_АВТОМАТИКИ, СУММА_ПЛАТЕЖЕЙ
Если данные отсутствуют, то они = 0.
Реально таблиц побольше, эти для примера.
Написал хранимую процедуру, выдает она результат только для одного телефона, для интервала выдает ошибку - что то вроде multiply rows.
Подскажите, пожалуйста, как составить правильный запрос?
← →
Romkin (2002-08-26 16:09) [1]for select вместо просто select
← →
elektro (2002-08-27 09:37) [2]>Romkin © (26.08.02 16:09)
Если написать:
select ТЕЛЕФОНЫ.НОМЕР,sum(АВТОМАТИКА.ДЕНЬГИ)),
sum(ПЛАТЕЖИ.ДЕНЬГИ)
where (ТЕЛЕФОНЫ.НОМЕР>=НОМЕР_1)and
(ТЕЛЕФОНЫ.НОМЕР<=НОМЕР_ПОСЛЕДНИЙ)and
(ТЕЛЕФОНЫ.НОМЕР=АВТОМАТИКА.НОМЕР)and
(ТЕЛЕФОНЫ.НОМЕР=ПЛАТЕЖИ.НОМЕР)and
(УСЛОВИЕ ПО ДАТЕ)
group by ТЕЛЕФОНЫ.НОМЕР
то набор данных по телефонам выдается, но собственно суммы искажены. Если убрать из select: sum(ПЛАТЕЖИ.ДЕНЬГИ), то оставшаяся сумма считается правильно.
А если использовать for select, то выбирать то он будет по такому же алгоритму и давать неправильные суммы ?
Может условие where неправлиьно сформулировал???
← →
ЮЮ (2002-08-27 09:51) [3]Сделай запрос без group, но добавь АВТОМАТИКА.ПОРЯДКОВЫЙ_НОМЕР и
ПЛАТЕЖИ.ПОРЯДКОВЫЙ_НОМЕР и посмотри какие интересные комбинации у тебя получатся в запросе. Откуда уж здесь взятся правильному суммированию
← →
elektro (2002-08-27 10:04) [4]>ЮЮ © (27.08.02 09:51)
делал. комбинации очень интересные.
Как суммирование правильно состряпать - не соображу никак.
← →
ЮЮ (2002-08-27 10:19) [5]Не знаю как в IB c пожзапросами, в MS SQL это было юы так:
select code,RelativesCnt,EducationCnt from
(select CODE from personnel where CODE>10 and CODE<20) personnel
left join
(select person, count(person) RelativesCnt from Relatives group by person) Relatives
on personnel.code=Relatives.person
left join
(select person, count(person) EducationCnt from Education group by person) Education
on personnel.code=Education.person
Таблицы оставил свои, запрос только что опробовал в SQL Explorer-е
← →
Romkin (2002-08-27 10:28) [6]Да не надо подзапросов, есть хранимые процедуры, с помощью которых это можно сделать гораздо быстрее
Что-то вроде
create procedure sel_summs(Nomer1 <тип>, NomerN <тип>, Data1 date, dataN date)
returns(Number <тип>, Суммаавтоматики numeric(15,2), Сумма платежей numeric(15,2))
as
begin
for select Number from Телефоны
where Number >= Nomer1 and Number <= NomerN
into :Number
do begin
select sum(Деньги) from Платежи
where Номер = :Number and (условие по дате)
into :СуммаПлатежей;
select sum(Деньги) from Автоматика
where Номер = :Number and (условие по дате)
into :СуммаАвтоматики;
suspend;
end
end
← →
elektro (2002-08-27 10:30) [7]Большое спасибо.
Попробую, хотя насчет такого подзапроса в IB не уверен, что он пропустит.
← →
elektro (2002-08-27 10:42) [8]>Romkin © (27.08.02 10:28)
Большое спасибо.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.09.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c