Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
ixen   (2012-10-24 10:47) [0]

Здравствуйте! Имеется таблица поступления товаров, с полями количество и цена единицы. Так как цена единицы со временем меняется, списание товаров происходит по средней цене, и чтобы ограничить объем вычисляемой инфолрмации я решил брать последние 100 операций поступлений и считать среднюю цену товара. Запрос получился такой:
select coalesce(sum(summ),0), coalesce(sum(kolvo),0) from moves where type_doc="+"
т.е. суммы считаются, но не могу сделать чтобы суммы считались только по последним 100 записям, пробовал так:
select first(100) coalesce(sum(summ),0), coalesce(sum(kolvo),0) from moves where type_doc="+"
но строки не ограничиваются, тогда сделал так:
select coalesce(sum(summ),0), coalesce(sum(kolvo),0) from moves where id in(select first(2) id from moves where type_doc="+" order by id desc)
в общем считается как надо, но правильно ли это? Есть ли более оптимальный и быстрый вариант решения?


 
Palladin ©   (2012-10-24 10:54) [1]

и при чем тут делфи?


 
Дмитрий С ©   (2012-10-24 11:04) [2]

А я СУБД какая?

В Mysql так:
SELECT sum(summ), sum(kolvo) FROM (SELECT summ, kolvo FROM moves ORDER BY id DESC LIMIT 100)

Так делать:
id in(select
скорее всего неправильно делать.


 
AV ©   (2012-10-24 11:04) [3]

в общем случае делаю как

выбрать первые N из
выбрать что надо, упорядоченные как надо


 
kilkennycat ©   (2012-10-24 11:05) [4]


> списание товаров происходит по средней цене

странный учет. партионный вроде ж не так работает?


 
ixen   (2012-10-24 11:06) [5]

Firebird


 
Inovet ©   (2012-10-24 11:09) [6]

> [4] kilkennycat ©   (24.10.12 11:05)
> странный учет.

Да. Почему не за 1000, или не за последний месяц, или не за все.


 
ixen   (2012-10-24 11:13) [7]


> Да. Почему не за 1000, или не за последний месяц, или не
> за все.
>
>

если считать среднюю стоимость за месяц, то возможен вариант, что в месяце может не быть поступлений этого товара, за весь период сильно большие цифры в вычислениях, в первом варианте у меня так и было, но потом задумался.. и вычисления будут все медленнее с ростом количества записей в базе. Можно брать и тысячу, но решил что 100 оптимально.. если есть какие то другие способы... подскажите.. а то я не кладовщик и не знаю как правильно


 
ixen   (2012-10-24 11:16) [8]

по подсказке Дмитрия С. сделал так
select cast(coalesce(sum(summ),0)/coalesce(sum(kolvo),0) as numeric(15,2)) from (select first(2) summ, kolvo from moves where type_doc="+" order by id desc)


 
Плохиш ©   (2012-10-24 11:18) [9]


> а то я не кладовщик и не знаю как правильно

Советую проконсультуроваться в бухгалтерии.


 
Дмитрий С ©   (2012-10-24 11:21) [10]


> ixen   (24.10.12 11:16) [8]

а почему не first(100) ? :)


 
oldman ©   (2012-10-24 11:23) [11]

Средняя величина всегда вычисляется с отклонением (дельта) плюс/минус
Это математика, блин!


 
ixen   (2012-10-24 11:24) [12]


> а почему не first(100) ? :)

дык для проверки, что правильно считает... в конечном варианте стоит first(100)


 
oldman ©   (2012-10-24 11:28) [13]


> Имеется таблица поступления товаров, с полями количество
> и цена единицы. Так как цена единицы со временем меняется,
>  списание товаров происходит по средней цене


поступило 1000 единиц по цене 1 и сто единиц по цене 100,2
списываем 500 единиц, купленных за 1 по цене 2?
класс!!!!!!!!!!!!!!!!


 
Inovet ©   (2012-10-24 11:31) [14]

> [7] ixen   (24.10.12 11:13)
> Можно брать и тысячу, но решил что 100 оптимально..

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

Надо делать как правильно, а не как удобнее это запрограммить.


 
картман ©   (2012-10-24 11:32) [15]


> oldman ©   (24.10.12 11:28) [13]

так тоже делают


 
Дмитрий С ©   (2012-10-24 11:33) [16]


> oldman ©   (24.10.12 11:28) [13]

ну я бы тоже изловчился и делал бы списание из поставки по которой поставили (собственно так и сделал, когда делал прогу для склада).

Но у него есть поле kol-vo. так что цена будет 1100/11000


 
Inovet ©   (2012-10-24 11:34) [17]

> [13] oldman ©   (24.10.12 11:28)

"Большие, но по 5, мелкие, но по 3."


 
ixen   (2012-10-24 11:37) [18]


> поступило 1000 единиц по цене 1 и сто единиц по цене 100,
> 2
> списываем 500 единиц, купленных за 1 по цене 2?
> класс!!!!!!!!!!!!!!!!
>
>

поступило 1000 по 1 = 1000 руб.
поступило 100 по 100,2 = 10020 руб.
всего 1100 на сумму 11020 руб.
списываем 500 по средней цене 11020/1100=10,01 на сумму 5005 руб.
остается 600 на сумму 11020-5005=6015

вроде все нормально..


 
Inovet ©   (2012-10-24 11:39) [19]

> [7] ixen   (24.10.12 11:13)
> и вычисления будут все медленнее с ростом количества

Да не на столько уж и медленнее они будут. Товар продаётся же, иначе зачем новый закупать. А 100 или 10000 записей просуммировать - не сильно принципиально для скорости.


 
Inovet ©   (2012-10-24 11:40) [20]

> [18] ixen   (24.10.12 11:37)
> вроде все нормально..

А где здесь последние/первые 100?


 
AV ©   (2012-10-24 11:45) [21]

т.е. сделано не
выбрать первые N из
выбрать что надо, упорядоченные как надо

а
> выбрать что надо из
> выбрать сырыми первые N, упорядоченные как надо

тут в иных СУБД можно нарваться, если забыть как выборка идет.
вместо
 выбрать сырыми первые N, упорядоченные как надо
 вернет первые N, упорядоченные как надо, но! из куска, который был хапнут сразу.
И если зафетчить все до конца, первые N будут другими.

как работает именно
>> Firebird
- не знаю. Может для него правильно так.


 
ixen   (2012-10-24 11:45) [22]


> Товар продается же, иначе зачем новый закупать.

товар то продается, но в базе записи то остаются и никуда не деваются
т.е. остаток считается как количество поступившего товара за все время минус количество израсходованного товара за все время... и для того чтобы посчитать на какую сумму остаток, я решил брать среднюю цену товара, но рассчитывать ее не за всю историю, а последние 100 операций поступления..

или все таки рассчитывать среднюю цену за все историю??


 
ixen   (2012-10-24 11:47) [23]


> А где здесь последние/первые 100?

я имел ввиду не первые 100 единиц, а первые 100 операций поступления... т.е. поступило 1000 по 1 руб. это 1-я операция, поступило 500 по 100,2 это 2-я.. и таких берется 100 операций и высчитывается средняя цена единицы товара..


 
Inovet ©   (2012-10-24 12:00) [24]

> [23] ixen   (24.10.12 11:47)
> а первые 100 операций поступления...

Я понял. Но где эти 100 операций, если расширить пример до 1000 поступленй?

> [22] ixen   (24.10.12 11:45)
> товар то продается, но в базе записи то остаются и никуда не деваются

Остатки периодически пересчитываются/сохраняются где-то или нет? Остаток по проданным 0, его исключить из выборки.

> [22] ixen   (24.10.12 11:45)
> или все таки рассчитывать среднюю цену за все историю??

Есть разные методы учёта, надо тот, какой надо, а не от себя выдумывать.


 
AV ©   (2012-10-24 12:11) [25]

в сабже, скорее расчет по средневзвешенной
Методика, имхо, спорная. Но так работают.


 
бить по голове   (2012-10-24 16:14) [26]


> ixen   (24.10.12 11:37) [18]


бить по голове за такие решения. Бегом в бухгалтерию...


 
картман ©   (2012-10-24 16:43) [27]


> поступило 1000 по 1 = 1000 руб.
> поступило 100 по 100,2 = 10020 руб.
> всего 1100 на сумму 11020 руб.
> списываем 500 по средней цене 11020/1100=10,01 на сумму
> 5005 руб.
> остается 600 на сумму 11020-5005=6015


так прогоришь. В российском бизнесе принято так:

списываем 500 по цене последних 100:
 500*100,2 = 50100 руб.
остается 11020 - 50100 = -39080
дальше смотря кто владелец:
а) гос-во - взять кредит на льготных условиях, нанять поднять зп топ-менеджменту;
б) частное лицо - ушли от налогов, обосновали повышение стоимости услуг, наехали на "невыносимое налоговое бремя";

goto start


 
бить по голове   (2012-10-24 16:50) [28]


> картман ©   (24.10.12 16:43) [27]


:)))


 
sniknik ©   (2012-10-24 19:45) [29]

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


 
бить по голове   (2012-10-24 19:50) [30]

нене остатки списываешь по цене последней поставке ))))
зы. менеджеры пофиг


 
kilkennycat ©   (2012-10-25 02:40) [31]

списывать надо самую дорогую поставку.


 
MsGuns ©   (2012-10-25 10:54) [32]

По сабжу - вопрос действительно вовсе не дельфишный и вообще не программистский, а бухгалтерский (см. [9])
Порядок определения цены при списании зависит от типа учета ТМЦ, применяемого в бух.учете конторы. При партионном учете он один, при средневзвешенном - другой. А есть еще смешанные.
Ищите в гугле по "учет материальных ценностей" и "FIFO/LIFO".


 
MsGuns ©   (2012-10-25 10:56) [33]

>kilkennycat ©   (25.10.12 02:40) [31]
>списывать надо самую дорогую поставку.

Совсем необязательно. Пообщайся с менеджерами-сметчиками :)


 
ixen   (2012-10-25 11:27) [34]

а что если делать так: допустим приход-расход записаны в неком логе, в котором хранятся все операции по товарам. Что бы найти остаток, приходится считать сколько поступило за всю историю, затем считать сколько убыло за всю историю, находим разницу, это будет остаток. Допустим остаток 5. Тогда мы берем стоимость последних пяти единиц товара и высчитываем их среднюю стоимость. Но если в последнем документе поступления был приход 2, а в базе он записан одной записью, т.е 2 штуки, с ценой единицы 100 руб., сумма считается автоматом в вычисляемом поле 2*100. и еще один документ 10 штук, с ценой 90 руб. Тогда придется брать 2*100+3*90 = 470. делим 470 на остаток. т.е. 5.. получаем сред. цену 470/5=94 руб. Так правильно будет? Но это правда гиморно реализовать в коде...


 
Плохиш ©   (2012-10-25 11:36) [35]


> Так правильно будет?

Продолжаем обсуждать сферического коня в вакууме...


 
ixen   (2012-10-25 11:40) [36]

да я хочу понять алгоритм расчета...


 
MsGuns ©   (2012-10-25 12:03) [37]

>ixen   (25.10.12 11:27) [34]
>а что если делать так:

И еще в бубен побить, и еще воскурить травки, отваренной в бульоне из усов дохлой крысы, высушеного семени йокатля, выдержанной в крови демона печени тахорга, в ночь полнолуния эраного числя месяца нисан, на лысой горе сидя на ступнях, отрезанных у посаженного на кол тут же вождя племени каннтбалов мумбасуки Цваранцокопакашбатенцавитабункцля


 
ixen   (2012-10-25 12:12) [38]


> И еще в бубен побить, и еще воскурить травки, отваренной
> в бульоне из усов дохлой крысы, высушеного семени йокатля,
>  выдержанной в крови демона печени тахорга, в ночь полнолуния
> эраного числя месяца нисан, на лысой горе сидя на ступнях,
>  отрезанных у посаженного на кол тут же вождя племени каннтбалов
> мумбасуки Цваранцокопакашбатенцавитабункцля

так и сделаю.. )))


 
kilkennycat ©   (2012-10-25 14:12) [39]

с дохлой крысой проблематично.


 
sniknik ©   (2012-10-25 14:42) [40]

> Так правильно будет?
логичнее... но ты не довел до логического конца ([29]) - если остатков хватает на списание с 3-й партии то штрафовать менеджера.



Страницы: 1 2 вся ветка

Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.069 c
2-1332606068
leklerk
2012-03-24 20:21
2013.03.22
Отслеживание изменений пользователя


2-1340016908
webpauk
2012-06-18 14:55
2013.03.22
Перехват нажатия клавиши мыши


3-1276674643
Hadroran
2010-06-16 11:50
2013.03.22
Построение представления


15-1337000174
Внук
2012-05-14 16:56
2013.03.22
На Москву!


15-1353223486
AV
2012-11-18 11:24
2013.03.22
Как правильно сказать по- английски





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский