Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.041 c
15-1173794839
novill
2007-03-13 17:07
2007.04.08
Гостевую специально отключили?


15-1173732577
Неюрист
2007-03-12 23:49
2007.04.08
Заполнить бланк лицензии на программный продукт


15-1173888490
Vlad Oshin
2007-03-14 19:08
2007.04.08
CGI. Генерация html странички. велосипед или самокат?


15-1173784031
Карелин Артем
2007-03-13 14:07
2007.04.08
Отделить Газели пассажирские от других машин. Как?


15-1173768840
ДмитрийЛ.
2007-03-13 09:54
2007.04.08
Проблема с выбором СУБД





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский