Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли одним запросом.. [D6, Paradox]


Страницы:   1 2

MsGuns ©   (2002-12-23 20:37:00) 

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

Таблица:

№ РС Дата платежа Сумма
----------------------------
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)


Johnmen   (2002-12-25 12:24:00) [1]

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

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


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


> ЮЮ © (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))


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

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


ЮЮ   (2002-12-25 11:19:00) [4]

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


Рыжик   (2002-12-25 11:12:00) [5]

Для 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 10:35:00) [6]

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


Johnmen   (2002-12-25 09:26:00) [7]

>MsGuns ©

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


MsGuns   (2002-12-24 19:28:00) [8]

>Johnmen © (24.12.02 16:46)

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

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


MsGuns   (2002-12-24 17:41:00) [9]

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

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


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


Johnmen   (2002-12-24 16:46:00) [10]

>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-сумма,

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


GLUKAS   (2002-12-24 10:15:00) [11]

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....
криво но щато одним запросом...


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

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

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

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

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

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


ЮЮ   (2002-12-24 07:33:00) [13]

№ РС Дата платежа Сумма
----------------------------
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
Как пользователь сможет исправить?


Наталия   (2002-12-24 06:58:00) [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 06:00:00) [15]

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


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

>Val © (23.12.02 21:32)

А на IB ?


gsu   (2002-12-23 21:37:00) [17]

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


Val   (2002-12-23 21:32:00) [18]

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


MsGuns   (2002-12-23 21:16:00) [19]

Не сообразил сразу написать 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


gsu   (2002-12-23 21:02:00) [20]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо