Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.16;
Скачать: CL | DM;

Вниз

Запрос 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
1-50719
Olorin
2002-09-04 15:37
2002.09.16
Вот запарка мож кто заметит в чем проблема...


1-50798
maxim2
2002-09-03 08:14
2002.09.16
Как текст из RichEdit сохранить в файл?


7-51009
dlK
2002-07-04 16:44
2002.09.16
TApplicationService и TTimer, парюсь 2-ой день. =((


1-50701
BDRON
2002-09-05 08:03
2002.09.16
Сохранить большой объем текстовых данных в файл


1-50754
Asderg
2002-09-04 05:56
2002.09.16
как засунуть деревце в файл?