powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вопрос про запрос, или Двойная запись
9 сообщений из 9, страница 1 из 1
Вопрос про запрос, или Двойная запись
    #32808714
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то никак мне не придумать, как сделать следующую вещь.

Есть таблица приходов-расходов, в которой применяется т.н. "двойная запись" (как у бухов), т. е. дата, счет, корсчет, сумма.

И никак мне запрос не составить, который бы считал остатки по счету на заданную дату, т.е. результат должен выглядеть так:

Дата | Счет | Остаток
----------------------
12.01.04 |сч1 | 300
12.01.04 |сч2 | 500
и т.д.

Проблема в том, что сч1,сч2 может быть указан и в поле "счет" и в поле "корсчет",
причем считать нужно не по всем полям, а только определенных типов (не все из них накопительные, например, глупо считать остаток по чисто расходному счету)

Понятно, что в 2 запроса это реально. А в один никак не получится? Опять же, если в один можно, тогда применительно к ASA - что выгодней по времени: считать одним запросом или двумя?
...
Рейтинг: 0 / 0
Вопрос про запрос, или Двойная запись
    #32808751
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Желательно бы увидеть для начала структуру таблицы скриптом.
...
Рейтинг: 0 / 0
Вопрос про запрос, или Двойная запись
    #32809239
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я ее в общем-то описал уже. Навроде этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
create table dba.moneys (
transaction_date date null, // дата операции
oursacc integer null, // счет
corracc integer null, // корсчет
income decimal( 30 , 4 ) null, // сумма прихода или расхода (м. б. полож или отриц)
);
...
Рейтинг: 0 / 0
Вопрос про запрос, или Двойная запись
    #32809310
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда по идее получение сумм каждого счета за указанный день будет примерно выглядеть так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT transaction_date, Account, Sum(IncomeForDate) AS TotalIncomeForDate
FROM (
  SELECT transaction_date, oursacc AS Account, sum(income) AS IncomeForDate
  FROM dba.moneys
  WHERE Transaction_date = '2004.01.12'
  GROUP BY transaction_date, oursacc
  UNION ALL
  SELECT transaction_date, corracc AS Account, sum(income) AS IncomeForDate
  FROM dba.moneys
  WHERE Transaction_date = '2004.01.12'
  GROUP BY transaction_date, corracc
) AS t
GROUP BY transaction_date, Account
Каждый из подзапросов, обьединенных UNION ALL, при наличие соотвествующего индекса нормально сгруппируется и посчитается, далее оптимизатор по хэш-таблице соберет по счетам общие суммы, что так же будет довольно быстро, учитывая то, что счетов не может быть сильно много и при обьединении на счет может быть максимум только 2 записи из подзапроса.

Далее в зависимости от желания можно этот запрос вынести в ХП, с параметром @transaction_date и убрать из запросов и группировок поле transaction_date, и использовать эту ХП уже для дальнейших операций, например прибавляя полученные суммы в таблицу остатков по счетам.
...
Рейтинг: 0 / 0
Вопрос про запрос, или Двойная запись
    #32809405
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бррр... Что-то не то. Я плохо объяснил, что ли?

Идея в том, чтобы подсчитать остаток на счетах на указанную дату. Ну, например (для простоты возьмем один счет, который со значением 1, остальные счета будем считать расходными статьями, накопление на них не интересует) в таблице moneys живут такие данные:

tr_date | oursacc | corracc | income
1.11.2004 | 1 | 5 | 50
2.11.2004 | 1 | 3 | -40
3.11.2004 | 1 | 145 | 150
4.11.2004 | 7 | 1 | -60
5.11.2004 | 1 | 563 | -100

Так вот, запрос на дату 3.11.2004 должен выдать сумму остатка=50-40+150=160

Запрос на 5.11.2004 должен выдать сумму остатка=50-40+150+60-100=120

А у вас в запросе суммируется приход за день. Это и проще можно сделать.
...
Рейтинг: 0 / 0
Вопрос про запрос, или Двойная запись
    #32809482
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а кто мешает в предложенном мною запросе поставить не равно дате, а меньше либо равно указанной дате ? На выходе по счетам будет получен остаток.

P.S. Если запросы с остатками идут довольно часто, то может быть имеет смысл все таки сделать аггрегатную табличку, в которой на каждый день и каждый счет хранить зафиксированный остаток ?
...
Рейтинг: 0 / 0
Вопрос про запрос, или Двойная запись
    #32809581
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Ну а кто мешает в предложенном мною запросе поставить не равно дате, а меньше либо равно указанной дате ? На выходе по счетам будет получен остаток


На самом деле, я так конечно уже попробовал. Херня какая-то получилась, прости меня Господи. На остатки не похожая.
...
Рейтинг: 0 / 0
Вопрос про запрос, или Двойная запись
    #32809583
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Группировку по дате убрать надо.
...
Рейтинг: 0 / 0
Вопрос про запрос, или Двойная запись
    #32809619
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин, да я уж понял, недосмотрел, поторопился и еще и со счетами напутал. Работает на самом деле :)

Главное я узнал - в один запрос можно. Заодно полезному научился - как можно результаты UNION просуммировать.

Спасибо
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вопрос про запрос, или Двойная запись
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]