Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сложный SQL-запрос, Логично ли использовать только MySQL? 
:(
    Опции темы
mus
Дата 3.3.2007, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 22.5.2005

Репутация: нет
Всего: 1



(РАБОТАЕМ С MySQL)

Задача следующая:

Вывести на экран результат вычисления стоимости товара после поступления новой партии на склад по средствам алгоритма вычисления средневзвешенного.

Заказчик всегда должен знать средневзвешенную стоимость товара.
Средневзвешенная стоимость считается так:
( стоимость_товара * остаток на складе + стоимость_товара_в_новой_партии * кол_во_товара_в_новой_партии) / общее_получившееся_кол-во

Например:
01.01 пришла самая первая партия товара Z по цене $10 в кол-ве 10 штук

01.02
остаток (кол-во пришедшего - кол-во проданного) = 5 шт.
цена_товара_Z_в_новой_партии = 15
кол-во_в_новой_партии = 10

Итого = ( 10 * 5 + 15 * 10) / 15 = 13.3

Средневзвешенная на момент 01.02 = 13.3

01.03
остаток = 10
цена_товара_новой_партии = 25
кол-во = 20

Итого = (10 * 13.3 + 25 * 20) / 30 = 21.1


Так вот, среднешвзвешенное хранить не представляется возможным, так как в случае удаления факта закупки (например - удалили вторую запись из пяти) или удаления факта продажи нам придется пересчитывать это значение.

Так вот, чтобы построить такой запрос логично ли использовать ЛИШЬ ресурсы MySQL? И представляется ли возможным вообще без наличия хранимых процедур (использую 4-ю версию) решить эту задачу с помощью лишь SQL-запроса?
Как осуществить подобие рекурсии для решения этой задачи?
PM MAIL   Вверх
skyboy
Дата 4.3.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



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

таблица Склад(незначимые в данном случае поля, вроде даты поступления и т.д. отбросим)
idТовара
количество
цена

таблица Поступление
idТовара
количество
цена

Код

SELECT товар.название,sum(объединённый_список.цена * объединённый_список.количество) / sum(объединённый_список.количество)
FROM
(
SELECT Склад.idТовара AS idТовара, Склад.Цена AS цена, Склад.Количество AS количество
FROM Склад
UNION ALL
SELECT Поступление.idТовара AS idТовара, Поступление.Цена AS Цена, Поступление.Количество AS Количество
) объединённый_список
INNER JOIN Товар
ON Товар.idТовар = объединённый_список.idТовар
GROUP BY объединённый_список.idТовара, товар.idТовар

PM MAIL   Вверх
mus
Дата 4.3.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 80
Регистрация: 22.5.2005

Репутация: нет
Всего: 1



Нет, схема такая...

Очень формально (использую лишь нужные атрибуты):

PRODUCTION

production_id
title
weight


ORDER (Закупка)

order_id
date
trans_cost (стоимость транс. нужна при расчете цены)
supplier_id (ИД поставщика)

SUP_ORD (Характеристическая связь "многие-ко-многим" между поставщиками, заказами и продукцией)

sup_ord_id
order_id
production_id
quantity
price


SALE (Продажи)

sale_id
date
trans_cost
client_id


SALE_CLIENT (Характеристическая связь "многие-ко-многим"

sale_client_id
sale_id
production_id
quantity
price
PM MAIL   Вверх
Бонифаций
Дата 4.3.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 20
Всего: 40



1) удалять старые (не последнюю добавленную ) записи - это неправильно. Воспитанные бухгалтеры так не поступают. Воспитанные бухгалтеры в случае ошибок добавляют новую сторнировочную (корректирующую) запись

2) почему нельзя просто хранить в базе и количество и закупочную цену всех товаров? тогда средневзвешенная стоимость считается просто
select товар, sum( количество  * цена)/ count(*) group by товар

3) а в какой таблице вы храните текущие остатки на складе? Или неужели пересчитываете все каждый раз исходя из order и sale?




--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
skyboy
Дата 4.3.2007, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(mus @  4.3.2007,  12:10 Найти цитируемый пост)
Нет, схема такая...

тяжело было её в первом посте привести? :-/
Цитата(Бонифаций @  4.3.2007,  12:30 Найти цитируемый пост)
select товар, sum( количество  * цена)/ count(*) group by товар

не совсем smile надо 
Цитата

sum( количество  * цена)/ count(*)sum(Количество)

а то получается средняя для партии полная цена smile
Цитата(Бонифаций @  4.3.2007,  12:30 Найти цитируемый пост)
удалять старые (не последнюю добавленную ) записи - это неправильно. Воспитанные бухгалтеры так не поступают. Воспитанные бухгалтеры в случае ошибок добавляют новую сторнировочную (корректирующую) запись

почему "неправильно"? Нет, удалять из базы, конечно, ничего нельзя - народ должен знать своих "героев". но зачем добавлять "корректирующие записи", если можно сделать так, что для пользователя удаление будет похоже на удаление - не видно в списке, не участвует в расчете? 
Цитата(mus @  4.3.2007,  12:10 Найти цитируемый пост)
Очень формально (использую лишь нужные атрибуты):

нужные атрибуты(исходя из формулы): 
количество единиц в партии
стоимость единицы в партии
название товара партии(для полноты статистики)

В приведенной схеме перечислено намного больше полей. Чтоб запутать, или просто кроме названия продукта и средневзвешенной цены надо что-то ещё?  smile 
PM MAIL   Вверх
Бонифаций
Дата 4.3.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 20
Всего: 40



Цитата(skyboy @  4.3.2007,  14:28 Найти цитируемый пост)
сли можно сделать так, что для пользователя удаление будет похоже на удаление - не видно в списке, не участвует в расчете? 


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

Разрешение править бухгалтерские или складские документы задним числом -  рано или поздно приводит к проблемам. В том числе с аудитом.

 Поэтому если делать по уму то удалять можно только те записи которые только что добавил (сам).



Это сообщение отредактировал(а) Бонифаций - 4.3.2007, 14:45


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
skyboy
Дата 4.3.2007, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Бонифаций @  4.3.2007,  12:30 Найти цитируемый пост)
Воспитанные бухгалтеры в случае ошибок добавляют новую сторнировочную (корректирующую) запись

верно ли я понимаю  - согласно правил этикета, для коррекции заведомо неправильной записи вводят фиктивные данные?
PM MAIL   Вверх
Бонифаций
Дата 4.3.2007, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 827
Регистрация: 15.9.2005
Где: Brisbane

Репутация: 20
Всего: 40



именно. Не фиктивные а корректирующие. На момент времени когда это обнаружили. Это называется "сторнирующая запись".



Это сообщение отредактировал(а) Бонифаций - 4.3.2007, 19:41


--------------------
 Бонифаций.
 
PM MAIL ICQ Skype GTalk Jabber YIM   Вверх
Akina
Дата 5.3.2007, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



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

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.2234 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.