![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли одним запросом.. [D6, Paradox]
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 ©
Да, да огласите весь список, пожалуйста