Текущий архив: 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