Форум: "Базы";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
Вниз
Срок задолженности Найти похожие ветки
← →
makz © (2007-01-10 07:21) [0]Есть таблица:
CREATE TABLE DOK (
ID INTEGER NOT NULL,
ID_ST INTEGER NOT NULL,
SUMM DECIMAL(15,2) NOT NULL,
DOKDATE DATE NOT NULL
);
В нее добавляются записи с SUMM > 0 и < 0. Вычисляются суммы по разным ST_ID:
select sum(SUMM) from DOK
group by ID_ST
(ID_ST - внешний ключ). Для вычисления срока в течение которого sum(SUMM) <0 используется ХП. Есть ли возможность обойтись без ХП, одним запросом? Прошу прощения, если невнятно задал вопрос, долго уже мучаюсь :).
← →
Sergey13 © (2007-01-10 08:15) [1]> Прошу прощения, если невнятно задал вопрос, долго уже мучаюсь
Предлагаешь долго мучиться и нам? Нифига непонятно, что надо.
← →
makz © (2007-01-11 07:25) [2]проще так:
CREATE TABLE DOK (
SUMM DECIMAL(15,2) NOT NULL,
DOKDATE DATE NOT NULL
);
Сюда добавляются записи, с возрастающей DOKDATE и разными SUMM. Если в на данную дату сумма отрицательная, то надо вычислить, как давно она отрицательная.
← →
unknown © (2007-01-11 07:33) [3]
select max(DOKDATE)-min(DOKDATE) from dok where summ<0
← →
makz © (2007-01-11 07:42) [4]имеете ввиду
select max(DOKDATE)-min(DOKDATE) from dok where sum(summ)<0
:)
проблема в том, что нужна не просто минимальная дата c отрицательной суммой, нужен именно последний промежуток времени, когда сумма была отрицательной.
← →
Sergey13 © (2007-01-11 08:50) [5]> [4] makz © (11.01.07 07:42)
> имеете ввиду
Вряд ли. Твой вариант запроса вообще, ИМХО, не имеет смысла. 8-)
Может нечто вроде
select max(dok1.DOKDATE)-(select max(dok2.DOKDATE) from dok dok2 where summ<0 and dok2.dokdate<dok1.dokdate)
from dok dok1 where summ<0
← →
makz © (2007-01-11 09:31) [6]
> > имеете ввиду Вряд ли. Твой вариант запроса вообще, ИМХО,
> не имеет смысла. 8-)
Я в курсе. Просто все немножко сложнее - не summ<0, а именно sum(summ)<0.
← →
Sergey13 © (2007-01-11 09:42) [7]> [6] makz © (11.01.07 09:31)
У sum(summ) не может быть конкретной даты - это абсурд помоему. Или я не понимаю задачи. Может это нарастающий итог? Что за процедура, которую ты хочешь заменить запросом - приведи код.
← →
makz © (2007-01-11 11:09) [8]Да, нарастающий итог.
← →
Sergey13 © (2007-01-11 11:15) [9]> [8] makz © (11.01.07 11:09)
Тогда без ХП вряд ли получится.
← →
makz © (2007-01-11 11:58) [10]может сделать что-ли вычислимое поле или вью с нарастаюшими итогами?
← →
unknown © (2007-01-11 12:09) [11]
> makz © (11.01.07 11:58) [10]
А чем, собственно, хп не устраивает?
← →
ЮЮ © (2007-01-11 12:10) [12]Может это и противоречит теории СУБД, но если данную процедуру требуется выполнять постоянно и она занимает много времени, то можно создать таблицу нарастающих итогов и корректровать её в триггерах таблицы DOK
← →
ЮЮ © (2007-01-11 12:12) [13]С другой стороны, если записи поступают строго в порядке возрастания DOKDATE DATE и не корректируются в дальнейшем, то текущую на момент внесения записи задолжность можно вычислить и хранить в поле этой же записи
← →
Johnmen © (2007-01-13 14:36) [14]
> makz ©
Нарастающий итог можно посчитать такSELECT A.DOKDATE, SUM(B.SUMM) FROM DOK A, DOK B
WHERE B.DOKDATE<=A.DOKDATE
GROUP BY A.DOKDATE
а дальше в ХП обойти в цикле.
← →
Павел Калугин © (2007-01-16 11:47) [15]> [14] Johnmen © (13.01.07 14:36)
Прости, не напомнишь как в одном запросе входящий исходящий остаток по операциям поднять?
← →
Павел Калугин © (2007-01-16 11:48) [16]> [15] Павел Калугин © (16.01.07 11:47)
когда-то делал нечто подобное но как корова языком слизала.. :(
← →
Johnmen (2007-01-16 15:38) [17]
> Павел Калугин © (16.01.07 11:47) [15]
Уточни, что конкретно надо. Желательно формализованно.
← →
Павел Калугин © (2007-01-16 16:45) [18]> [17] Johnmen (16.01.07 15:38)
есть данные по операциям (проводки грубо говоря) видадата сумма вид_опер
0 10 +1
1 10 +1
2 11 -1
3 12 +1
4 13 +1
5 14 -1
6 14 +1
с даты 2 по дату 5 надо получить отчет видавходящий остаток на начало 10*1+10*1 = 20
Дата Вх остаток Сумма операции Исх остаток
2 20 11 20+11*-1 = 9
3 9 12 9+12*+1 = 21
4 21 13 21+13*+1 = 34
5 34 14 34+14*-1 = 20
исходящий остаток на окончание 20
в курсоре (цикле) я такое собирал неоднократно. Но слышал (читал) что можно собрать одним запросом. как? может известно?select (select sum(сумма*вид_опер) from таблица as T where Старт<=T.дата <R.дата),
R.сумма,
(select sum(T.сумма*T.вид_опер) from таблица as T where СтартПериода<=T.дата <R.дата)+ R.сумма*вид_опер
from таблица as R
where R.дата в периоде отчета
ну вроде можно и так но жутко неэффективно, как мне кажется..
← →
stone © (2007-01-16 17:05) [19]declare @t table(dt int, sm int, v int, rest int)
insert into @t
select 0, 10, +1, null
union all
select 1, 10, +1, null
union all
select 2, 11, -1, null
union all
select 3, 12, +1, null
union all
select 4, 13, +1, null
union all
select 5, 14, -1, null
union all
select 6, 14, +1, null
declare @rest int
set @rest = 0
update @t set @rest = rest = @rest + sm*v
select * from @t
← →
stone © (2007-01-16 17:06) [20]в догонку, сорри это TSQL, на сабж не посмотрел
← →
Павел Калугин © (2007-01-16 17:09) [21]> [19] stone © (16.01.07 17:05)
и это можно во view завернуть?
← →
stone © (2007-01-16 17:13) [22]нет, только как процедуру, view, насколько я помню не поддерживает объявления переменных
← →
Павел Калугин © (2007-01-16 17:16) [23]> [22] stone © (16.01.07 17:13)
> [10] makz © (11.01.07 11:58)
> может сделать что-ли вычислимое поле или вью с нарастаюшими
> итогами?
← →
Johnmen (2007-01-16 17:35) [24]
> Павел Калугин © (16.01.07 16:45) [18]
Определись, что важнее - быстрее и понятнее, но писать ХП, или медленнее и менее понятно, но один многоэтажный запрос.
Вычисляемое поле делать не советую. Т.к. это вопреки нормализации, а самое главное - тормоза при выборке, да и вообще такое поле создать не получится ИМХО потому, что будет селективная выборка из себя самой.
← →
Павел Калугин © (2007-01-16 17:41) [25]> [24] Johnmen (16.01.07 17:35)
да 23 это так к слову о внимательности
если по поводу
> [18] Павел Калугин © (16.01.07 16:45)
то важно бысттро и эффективно построить отчет
← →
Johnmen (2007-01-16 18:06) [26]
> Павел Калугин © (16.01.07 17:41) [25]
Тогда пиши ХП, где прямой обход записей SELECT * From Table ORDER BY дата.
И, ес-но, логическая и расчётная обработка.
Это будет максимально быстро.
← →
Павел Калугин © (2007-01-16 18:16) [27]> [26] Johnmen (16.01.07 18:06)
> Тогда пиши ХП, где прямой обход записей SELECT * From Table
> ORDER BY дата.
> И, ес-но, логическая и расчётная обработка.
> Это будет максимально быстро.
то есть нужный период отбираем во временную таблицу и по ней в курсоре расставляем вход исход остатки по операциям? и это будет максимально быстро? но почему это будет быстрее запроса?
← →
Johnmen (2007-01-16 18:28) [28]
> Павел Калугин © (16.01.07 18:16) [27]
> то есть нужный период отбираем во временную таблицу
> и по ней в курсоре расставляем вход исход остатки по операциям?
Ни о каких вр.таблицах речь не идёт!
Все сформированные конечные записи получаем на выходе ХП.
← →
Павел Калугин © (2007-01-16 18:36) [29]> [28] Johnmen (16.01.07 18:28)
Окончательно Вы меня запутали понял.
есть данныедата | сумма | вид операции
надо получить в виде
дата | сумма до операции | сумма операции | сумма после операции
прямой обход? то есть прямо в курсоре и наружу отдавать?
← →
Johnmen (2007-01-16 18:43) [30]
> Павел Калугин © (16.01.07 18:36) [29]
Прямо из "курсора" берём, обрабатываем, возвращаем из ХП.
SELECT FROM ХП возвратит нам результирующий набор данных.
ЗЫ
Есть подозрение, что ты не знаешь, как работать с ХП, возвращающей набор данных. Читать здесь ibase.ru
← →
Павел Калугин © (2007-01-16 19:11) [31]> [30] Johnmen (16.01.07 18:43)
подозрение верное. ибо и ib почти не работал...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.045 c