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

Вниз

Можно ли одним запросом..   Найти похожие ветки 

 
MsGuns ©   (2002-12-23 20:37) [0]

Помогите, пожалуйста !

Таблица:

№ РС Дата платежа Сумма
----------------------------
1 1.12.02 10
1 2.12.02 20
1 3.12.02 5
1 4.12.02 100
1 5.12.02 30
2 1.12.02 60
...

Надо получить:

1) Сумму всех платежей по РС 1
2) Дату самого раннего платежа
3) Дату самого позднего платежа
4) Сумму самого раннего платежа
5) Сумму самого позднего платежа

Можно ли все это сделать ОДНИМ запросом ?

(Использую BDE и Local SQL)


 
gsu ©   (2002-12-23 20:40) [1]

Все сразу ?


 
MsGuns ©   (2002-12-23 20:42) [2]

>gsu © (23.12.02 20:40)
>Все сразу ?

По очереди с сохранением в промежуточных таблицах и я умею 8)))






 
gsu ©   (2002-12-23 20:50) [3]

Издеваешься ?
Так какая конечная цель ? Это у тя, что супер minimax или противоречивость условий ?


 
MsGuns ©   (2002-12-23 20:55) [4]

>gsu © (23.12.02 20:50)
>Издеваешься ?

Ничуть. Знаю, что то делается через вложенный SELECT с HAVING. Но у меня не получается 8(



 
gsu ©   (2002-12-23 20:56) [5]

Так какая конечная цель ? Это у тя, что супер minimax или противоречивость условий ?


 
gsu ©   (2002-12-23 20:58) [6]

Скорре всего можно, но лучшее враг хорошего и при оптимизации возникает куча ошибок, а про издеваешься, я шучу.


 
Val ©   (2002-12-23 20:59) [7]

>MsGuns © (23.12.02 20:37)
нельзя ли пример желаемого результирующего НД, основанного на приведенных данных?


 
gsu ©   (2002-12-23 21:02) [8]

>> Val ©
Да, да огласите весь список, пожалуйста


 
MsGuns ©   (2002-12-23 21:16) [9]

Не сообразил сразу написать 8(

Таблица:

№ РС Дата платежа Сумма
----------------------------
1 1.12.02 10
1 2.12.02 20
1 3.12.02 5
1 4.12.02 100
1 5.12.02 30
2 1.12.02 60
...

Результат:
1 1.12.02 10 5.12.02 30 165

самый ранний: дата и сумма
самый поздний: дата и сумма
сумма всех

Еще раз оговорюсь: Local SQL


 
Val ©   (2002-12-23 21:32) [10]

не уверен что на локал это возможно. явно должны использоваться подзапросы и внешнее объединение.


 
gsu ©   (2002-12-23 21:37) [11]

sql - функциональный язык и некие сложности лучше преодолевать процедурно, извиняюсь за слабый ответ, но я соглашусь с Val


 
MsGuns ©   (2002-12-23 21:38) [12]

>Val © (23.12.02 21:32)

А на IB ?


 
Наталия ©   (2002-12-24 06:00) [13]

А на IB написать ХП


 
Наталия ©   (2002-12-24 06:58) [14]

Например так, но не проверяла, наверняка ошибки есть :)
ALTER PROCEDURE P1
(
)
RETURNS
(
N INTEGER,
D1 DATE,
S1 NUMERIC(10,2),
D2 DATE,
S2 NUMERIC(10,2)
)
AS
DECLARE VARIABLE NV INTEGER;
DECLARE VARIABLE DV DATE;
DECLARE VARIABLE SV NUMERIC(10,2);
DECLARE VARIABLE NOM INTEGER;

BEGIN
FOR SELECT NOMER,DATA,SUMMA FROM TABL
INTO :NV, :DV, :SV
ORDER BY NOM,DATA
DO
NOM=:NV;
D1=:DV;
S1=:SV;
BEGIN

IF (:NOM<>NV) THEN
SUSPEND;
NOM=:NV;
N=:NV;
D1=:DV;
S1=:SV;
ELSE
D2=:DV;
S2=:SV;
END
END


 
ЮЮ ©   (2002-12-24 07:33) [15]

№ РС Дата платежа Сумма
----------------------------
1 1.12.02 10

И это все поля. А если в один день придут два платежа:
1 1.12.02 10
1 1.12.02 10
и выяснится что в одном из них ошибка, надо
1 1.12.02 20
1 1.12.02 10
Как пользователь сможет исправить?


 
stone ©   (2002-12-24 09:50) [16]

Здесь можно использовать вложенные запросы:

select Дата, Сумма from Таблица where Дата = (select min(Дата) from Таблица)
union all
select Дата, Сумма from Таблица where Дата = (select max(Дата) from Таблица)

/* дальше возникает небольшая проблемма предыдущие два запроса возвращают по 2 поля, а последний одно, следовательно нужно привести все три запроса к одной структуре возвращаемого набора данных */

кроме того любой из первых двух запросов теоритически может вернуть более одного значения

Определитесь сначала с задачей


 
GLUKAS ©   (2002-12-24 10:15) [17]

Select MIN(t.Date_pl),MAX(t.Date_pl),
(select SUM(suma) from tabl1 d where date_pl=min(t.date_pl) and d.PC=t.PC)
(select SUM(suma) from tabl1 d where date_pl=max(t.date_pl) and d.PC=t.PC)
from tabl1 t

Для IB....
криво но щато одним запросом...


 
Johnmen ©   (2002-12-24 16:46) [18]

>MsGuns © (23.12.02 21:38)
>>Val © (23.12.02 21:32)

>А на IB ?

вот так железно для всех PC :
SELECT
t1.n,
MIN(t1.d) dmin,
sum(t1.s) stotal,
(SELECT SUM(t3.s)
FROM t t3
WHERE (t3.d=(SELECT MIN(t2.d)
FROM t t2
WHERE (t2.n=t1.n)) AND (t3.n=t1.n))
) smin,
MAX(t1.d) dmax,
(SELECT SUM(t4.s)
FROM t t4
WHERE (t4.d=(SELECT MAX(t5.d)
FROM t t5
WHERE (t5.n=t1.n)) AND (t4.n=t1.n))
) smax
FROM t t1
GROUP BY t1.n

где t-таблица, n-PC, d-дата, s-сумма,

Но на практике, конечно, во избежании больших временных затрат, связанных со вложенными запросами, лучше делать через ХП, как уже говорили...


 
MsGuns ©   (2002-12-24 17:41) [19]

Всем большое спасибо !
>ЮЮ © (24.12.02 07:33)
>И это все поля. А если в один день придут два платежа:

Не придут. Это вообще-то не платежи, а выписки банка, причем по одному РС (банки, как известно, более одной выписки в день не дают), и сумм там несколько бОльше, чем одна. Но это на суть проблемы не влияет.
Я подозревал, что вы подозреваете, что я подозреваю, что вы подозреваете 8)))


>Johnmen © (24.12.02 16:46)
Сейчас попробую.. Спасибо, ЕвГений 8))


 
MsGuns ©   (2002-12-24 19:28) [20]

>Johnmen © (24.12.02 16:46)

В Local SQL ошибок не дает. Выполняется, но поля smin и smax пустые, хотя записей с пустыми суммами (NULL) в таблице нет совсем. Просмотрел на педмет ошибок раз 8. Ошибок у себя не нашел - все "как у людей" (в смысле как ты написал).
Ну да ладно, сделаю процей через промежуточные НД

Еще раз большое спасибо.


 
Johnmen ©   (2002-12-25 09:26) [21]

>MsGuns ©

Привет, Серега !
Приведенный мной запрос я, естественно, оттестировал. Все работает как ожидается (IB) ! Может быть ты напутал со скобками ?Или Local SQL просто балдеет...)))


 
ЮЮ ©   (2002-12-25 10:35) [22]

Просто только одна BDE и борется с теми, кто для каждой строки основного НД пытается выполнять свой подзапрос, а то и несколько :-)


 
Рыжик ©   (2002-12-25 11:12) [23]

Для Local SQL:

select a.paydate,a.summa,b.paydate,b.summa, sum(c.summa)
from test as a ,test as b,test as c
where a.pc=1 and b.pc=1 and c.pc=1
and a.paydate in (select min(paydate) from test where pc=1)
and b.paydate in (select max(paydate) from test where pc=1)
group by a.paydate,a.summa,b.paydate,b.summa


 
ЮЮ ©   (2002-12-25 11:19) [24]

Рыжик © (25.12.02 11:12)
С конкретным pc=1 и тот работать будет, причем правильно, в отличии от вашего :-)


 
ЮЮ ©   (2002-12-25 11:23) [25]

Извиняюся за "в отличии от вашего" :-)
Те, как и ваш будут работать только в рамках существующего ограничения: pc + paydate = unique


 
Рыжик ©   (2002-12-25 11:35) [26]


> ЮЮ © (25.12.02 11:23)


Для "не конкретного" PC:
select a.pc,a.paydate,a.summa,b.paydate,b.summa, sum(c.summa)
from test as a ,test as b,test as c
where a.pc=b.pc and a.pc= c.pc
and a.paydate in (select min(paydate) from test where pc=a.pc)
and b.paydate in (select max(paydate) from test where pc=a.pc)
group by a.pc,a.paydate,a.summa,b.paydate,b.summa

А на счет уникальности: я так понимаю она есть (MsGuns © (24.12.02 17:41))


 
Johnmen ©   (2002-12-25 12:24) [27]

>Рыжик © (25.12.02 11:35)

Екатерина !
Отличное решение ! Нравятся мне думающие люди...:)))



Страницы: 1 вся ветка

Текущий архив: 2003.01.20;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.021 c
14-62722
Юлия
2002-12-30 10:39
2003.01.20
bde install


8-62677
nsvi
2002-09-30 11:32
2003.01.20
Предлагаю решение проблемы сохранения 256-цветных иконок


6-62709
VS2001
2002-11-22 06:39
2003.01.20
Многопоточная закачка по ФТП протоколу


1-62620
werr
2003-01-09 10:34
2003.01.20
Форму программы на передний план


3-62396
Anton
2002-12-20 09:07
2003.01.20
Фильтрация по TDateTime