Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Среднемесячные остатки / 25 сообщений из 33, страница 1 из 2
29.05.2018, 10:39
    #39651579
Cursor777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Доброе утро всем. Пусть есть таблица (Table1), которая содержит: A (приход), B(расход) и дату. Есть таблица (Table2), которая содержит номер человека - id и его имя - Name.
Необходимо найти среднемесячный остаток по таблице Table1 для определенного человека из Table2.
Note: Сначала получение остатков за каждый календарный день для каждого человека, затем получение среднего.
Вопрос: в коде я делю на 31 день (например, март), но по сути, не каждый ведь день может быть оборот. Как исключать такие дни?
Подсказали сделать подзапрос в From, но дальше я не могу понять что делать с этим Temp, и как произвести выборку.
Подскажите, опытные.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT 
        TB2.id, TB2.Name, 
        SUM(B - A) /
                ( SELECT 
                    MAX(LEVEL) AS Count_Days 
                    FROM dual 
                    START WITH :p_BegDate <= :p_EndDate
                    CONNECT BY :p_BegDate + rownum <= :p_EndDate
                )
                AS Balance
    FROM 
        Table1 TB1, Table2 TB2, (SELECT trunc(:p_BegDate + rownum - 1) AS Temp
                                FROM DUAL 
                                START WITH :p_BegDate <= :p_EndDate
                                CONNECT BY :p_BegDate + rownum <= :p_EndDate
                                )
    WHERE 
        TB1.DATE_T >= :p_BegDate AND TB1.DATE_T <= :p_EndDate        
        AND TB2.ID Like '1_' 
        AND TB2.id = TB1.tb2_id 
    GROUP BY TB2.id, TB2.Name
    ORDER BY 3 DESC;
...
Рейтинг: 0 / 0
29.05.2018, 10:48
    #39651589
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Cursor777 Вопрос: в коде я делю на 31 день (например, март), но по сути, не каждый ведь день может быть оборот. Как исключать такие дни?

Зачем исключать?
Надо на каждый день посчитать остаток, сложить и разделить.
Иначе правильной цифры не получишь.
...
Рейтинг: 0 / 0
29.05.2018, 10:57
    #39651600
Cursor777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
982183, возможно не так условие понял. Не подскажите дальнейшие действия исходя из кода?
...
Рейтинг: 0 / 0
29.05.2018, 11:52
    #39651663
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
982183Cursor777 Вопрос: в коде я делю на 31 день (например, март), но по сути, не каждый ведь день может быть оборот. Как исключать такие дни?

Зачем исключать?
Надо на каждый день посчитать остаток, сложить и разделить.
И наче правильной цифры не получишь .

получить, но чуть посложнее

.....
stax
...
Рейтинг: 0 / 0
29.05.2018, 12:02
    #39651671
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Cursor777 Note: Сначала получение остатков за каждый календарный день для каждого человека, затем получение среднего.

двигайтесь последовательно,сначала получите остатки
можно за каждый день (так проще), можно за период когда был оборт (чуть сложнее)
зы
как-то странно у Вас Приход уменьшает остаток и наоборот
зыы
страноватое вычисление
( SELECT
MAX(LEVEL) AS Count_Days
FROM dual
START WITH :p_BegDate <= :p_EndDate
CONNECT BY :p_BegDate + rownum <= :p_EndDate
)
AS Balance
гляньте на :p_EndDate-:p_BegDate +1

.....
stax
...
Рейтинг: 0 / 0
29.05.2018, 12:13
    #39651678
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Staxполучить, но чуть посложнее

ПРАВИЛЬНОЙ не получить.

Ситуация:
1-го числа прошло 100шт.
31-го числа продано 100 шт.

Вариант1 (100+0)/2=50
Вариант1 (100*30+0)/31=96,77
...
Рейтинг: 0 / 0
29.05.2018, 12:18
    #39651684
Cursor777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Staxгляньте на :p_EndDate-:p_BegDate +1


Выводит 29 дней в марте.
...
Рейтинг: 0 / 0
29.05.2018, 12:21
    #39651686
Cursor777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Staxзы
как-то странно у Вас Приход уменьшает остаток и наоборот
зыы
страноватое вычисление
( SELECT
MAX(LEVEL) AS Count_Days
FROM dual
START WITH :p_BegDate <= :p_EndDate
CONNECT BY :p_BegDate + rownum <= :p_EndDate
)
AS Balance
гляньте на :p_EndDate-:p_BegDate +1

.....
stax

Это просто вычисление количества дней в месяце, беру максимальную дату, т.е 31 день - это и будет делимым.
...
Рейтинг: 0 / 0
29.05.2018, 12:32
    #39651698
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
982183Staxполучить, но чуть посложнее

ПРАВИЛЬНОЙ не получить.

Ситуация:
1-го числа прошло 100шт.
31-го числа продано 100 шт.

Вариант1 (100+0)/2=50
Вариант1 (100*30+0)/31=96,77
счітаем
1) что до 1-го оборота не было
2) остаток на конец дня

тогда среднее среднее (100*30+0*1)/31

если я провавильно понимаю "среднемесячный остаток"

.....
stax
...
Рейтинг: 0 / 0
29.05.2018, 12:35
    #39651702
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Cursor777Это просто вычисление количества дней в месяце, беру максимальную дату, т.е 31 день - это и будет делимым.

Cursor777Staxгляньте на :p_EndDate-:p_BegDate +1


Выводит 29 дней в марте.

31/03/18-01/03/18+1=31дней

.....
stax
...
Рейтинг: 0 / 0
29.05.2018, 13:55
    #39651776
Cursor777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
[/quot]
двигайтесь последовательно,сначала получите остатки
можно за каждый день (так проще), можно за период когда был оборт (чуть сложнее)
[/quot]

Вывел как Вы и сказали за каждый день. В итоге значение меняется только 14, 22 и 27 числа. Как дальше с этим быть?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT -P_SALDO.GETSALDO('1', '01/03/2018') SALDO FROM DUAL; -- -34050617,86
...
SELECT -P_SALDO.GETSALDO('1', '14/03/2018') SALDO FROM DUAL --меняется : -34516117,86
...
SELECT -P_SALDO.GETSALDO('1', '22/03/2018') SALDO FROM DUAL --меняется : -34649451,19
...
SELECT -P_SALDO.GETSALDO('1', '27/03/2018') SALDO FROM DUAL --меняется : -34666901,19
...
SELECT -P_SALDO.GETSALDO(970692, '01/04/2018') SALDO FROM DUAL;  
...
Рейтинг: 0 / 0
29.05.2018, 13:56
    #39651777
Cursor777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Cursor777
двигайтесь последовательно,сначала получите остатки
можно за каждый день (так проще), можно за период когда был оборт (чуть сложнее)
[/quot]

SELECT -P_SALDO.GETSALDO('1', '01/04/2018') SALDO FROM DUAL; --была ошибочка с id

[/src][/quot]
...
Рейтинг: 0 / 0
29.05.2018, 14:39
    #39651807
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Cursor777,

я не умею использовать/создавать функции (GETSALDO) в кляузе with поетому придется создавать таблички

что займет чутку времени

счас нарисую

.....
stax
...
Рейтинг: 0 / 0
29.05.2018, 14:53
    #39651820
Cursor777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Stax,
эта функция аналог:
Код: plsql
1.
2.
3.
4.
5.
SELECT SUM(A - B) AS SALDO
    FROM Table1 
    WHERE
        tb2_id = 1 AND  - id человека
        DATE_TURN <= :p_EndDate


Просто для сокращения места.
...
Рейтинг: 0 / 0
29.05.2018, 15:01
    #39651827
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Cursor777,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
SQL> select * from t1;

        ID          A          B DAT
---------- ---------- ---------- --------
         1        100          0 01.01.18
         1          0        100 15.05.18
         2        400        100 20.05.18

SQL> select * from t2;

        ID NAME
---------- ---------
         1 Cursor777
         2 Stax
         3 Anna

SQL> select
  2     id
  3    ,max(name) name
  4    ,sum(nvl(-getsaldo(id,work),0))/31 avg_saldo
  5  from t2
  6  ,(
  7    SELECT date '2018-05-01'+level-1 AS work
  8    FROM DUAL
  9    CONNECT BY date '2018-05-01'+level-1 <= date '2018-05-31') d
 10  group by id
 11  order by 1
 12  /

        ID NAME       AVG_SALDO
---------- --------- ----------
         1 Cursor777 45,1612903
         2 Stax      116,129032
         3 Anna               0



ето иногда не оптимально (искать сальдо на каждый день),
но для лабы за месяц пойдет

.....
stax
...
Рейтинг: 0 / 0
29.05.2018, 15:31
    #39651854
Cursor777
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Stax,
Большое Вам спасибо!
...
Рейтинг: 0 / 0
30.05.2018, 04:24
    #39652149
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Stax982183пропущено...

ПРАВИЛЬНОЙ не получить.

Ситуация:
1-го числа прошло 100шт.
31-го числа продано 100 шт.

Вариант1 (100+0)/2=50
Вариант1 (100*30+0)/31=96,77
счітаем
1) что до 1-го оборота не было
2) остаток на конец дня

тогда среднее среднее (100*30+0*1)/31

если я провавильно понимаю "среднемесячный остаток"

.....
stax

Странное у вас понимание "среднемесячного остатка"
Есть складские запасы, и им безразлично есть товар или нет, есть движение или нет.
Нет товара - остаток ноль, нет движения - остатки от этого не меняются.

Соответственно в примере с 1 по 30 остатки были 100шт. 31-го - ноль.
Соответственно "средние остатки" (100*30+0)/31=96,77 и никак по другому.
...
Рейтинг: 0 / 0
30.05.2018, 08:32
    #39652203
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Для оптимальности товародвижения и складских запасов важны метрики "средняя реализация за период" (при ее отсутствии - "срок залежалости"), "кол-во дней периода, когда остаток был 0" и прочие кручения-верчения на тему "как бы продать побольше".

А это просто задачка, готовящая студент к общению с бухгалтерией и маркетингом :).
...
Рейтинг: 0 / 0
30.05.2018, 08:52
    #39652216
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
982183Staxпропущено...

счітаем
1) что до 1-го оборота не было
2) остаток на конец дня

тогда среднее среднее (100*30+0*1)/31

если я провавильно понимаю "среднемесячный остаток"

.....
stax

Странное у вас понимание "среднемесячного остатка"
Есть складские запасы, и им безразлично есть товар или нет, есть движение или нет.
Нет товара - остаток ноль, нет движения - остатки от этого не меняются.

Соответственно в примере с 1 по 30 остатки были 100шт. 31-го - ноль.
Соответственно "средние остатки" (100*30+0)/31=96,77 и никак по другому.

а я как посчитал? 21449768

насчет по другому, отвечал на
21449262

982183Cursor777 Вопрос: в коде я делю на 31 день (например, март), но по сути, не каждый ведь день может быть оборот. Как исключать такие дни?

Зачем исключать?
Надо на каждый день посчитать остаток, сложить и разделить.
Иначе правильной цифры не получишь.


повторюсь, не обязательно (а часто излишне/затратно) считать остаток за/на каждый день

вообще-то, зависит от бухов, напр выходные/праздники

зы
в системах (в тч склиды -бакалия,гсм,комплектующие ) с которыми я работал,
остатки хранятся в отдельной табличке/mv ,

считаю ето правильным
.....
stax
...
Рейтинг: 0 / 0
30.05.2018, 08:54
    #39652220
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
dmdmdm,

мож ето и не склад, напр счет

.....
stax
...
Рейтинг: 0 / 0
30.05.2018, 09:27
    #39652242
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Staxа я как посчитал?
Сорри. увидел.
Stax, напр выходные/праздники
Да, есть такое дело, иногда просят нерабочие дни исключить.
Staxостатки хранятся в отдельной табличке
Ну так там наверное хранят текущие остатки, а не остатки на конец каждого дня.
...
Рейтинг: 0 / 0
30.05.2018, 09:52
    #39652264
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
982183Ну так там наверное хранят текущие остатки, а не остатки на конец каждого дня.
когда был оборот (остаток, заодно и сумарные обороты)

наверное можно и каждый день, зависит от обемов

зы
имхо
по любому какие-то выверенные остатки надо хранить (на начало года,квартала, месяца, дня)

.....
stax
...
Рейтинг: 0 / 0
30.05.2018, 11:56
    #39652366
kernA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Stax982183Ну так там наверное хранят текущие остатки, а не остатки на конец каждого дня.
когда был оборот (остаток, заодно и сумарные обороты)

наверное можно и каждый день, зависит от обемов

зы
имхо
по любому какие-то выверенные остатки надо хранить (на начало года,квартала, месяца, дня)

.....
stax

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

Можно посчитать среднемесячный остаток, как:
1. Дельта остатка(за день с начала месяца*) = сумма прихода* - сумма расхода
2. среднемесячный остаток = остаток на начало периода + среднее значение Дельты остатка

Но это будет среднее по больнице
...
Рейтинг: 0 / 0
30.05.2018, 11:59
    #39652370
982183
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
Staxкогда был оборот (остаток, заодно и сумарные обороты)
Обороты наверное лучше иметь где-то в OLAP кубе.

Staxпо любому какие-то выверенные остатки надо хранить (на начало года,квартала, месяца, дня)
а зачем?
отчетность это вряд ли ускорит.
Достоверность надо проверять.

А "текущие" остатки несомненно крайне важны, дабы при реализации, при подборе товара их не высчитывать.
...
Рейтинг: 0 / 0
30.05.2018, 12:17
    #39652386
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Среднемесячные остатки
982183Staxкогда был оборот (остаток, заодно и сумарные обороты)
Обороты наверное лучше иметь где-то в OLAP кубе.

Staxпо любому какие-то выверенные остатки надо хранить (на начало года,квартала, месяца, дня)
а зачем?
отчетность это вряд ли ускорит.
Достоверность надо проверять.

А "текущие" остатки несомненно крайне важны, дабы при реализации, при подборе товара их не высчитывать.
мож ето и куб, я в етом слабо разбираюсь
для ускорения ети избыточные данные и хранятся отдельно, напр баланс на ...

зы
диасофтовцы расказывали байку, что в некотором ОДБ (не буду называть),
остатки ВООБЩЕ не хранятся, всегда расчитываются
я не верю

.....
stax
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Среднемесячные остатки / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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