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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.041 c
15-1172053340
IMHO
2007-02-21 13:22
2007.04.08
Сталин был велик?


15-1172580809
Alex Konshin
2007-02-27 15:53
2007.04.08
Трассировка exception в Delphi


6-1161325036
YurkaT
2006-10-20 10:17
2007.04.08
IdHTTPServer - проблемма с выполнением JS


15-1173657026
RASkov
2007-03-12 02:50
2007.04.08
NoSubj


15-1173799748
oldman
2007-03-13 18:29
2007.04.08
Accept "Механическое сердце"