Средние остатки на складах запрос SQL

В данной статье приведено решение оптимизации на Transact SQL задачи расчета остатки на складах. Применено: партицирование таблиц и материализованных представлений.

Постановка задачи

Задачу необходимо решить на SQL Server 2014 Enterprise Edition (x64). В фирме есть много складов. В каждом складе ежедневно по нескольку тысяч отгрузок и приемок продуктов. Есть таблица движений товаров на складе приход/расход. Необходимо реализовать:
Расчет баланса на выбранную дату и время (с точностью до часа) по всем/любому складам по каждому продукту. Для аналитики необходимо создать объект (функцию, таблицу, представление) с помощью которого за выбранный диапазон дат вывести по всем складам и продуктам данные исходной таблицы и дополнительную расчетную колонку — остаток на складе позиции.
Указанные расчеты предполагаются выполняться по расписанию с разными диапазонами дат и должны работать в приемлемое время. Т.е. если необходимо вывести таблицу с остатками за последний час или день, то время выполнения должно быть максимально быстрым, равно как и если необходимо вывести за последние 3 года эти же данные, для последующей загрузки в аналитическую базу данных.
Технические подробности. Сама таблица:
create table dbo.Turnover ( id int identity primary key, dt datetime not null, ProductID int not null, StorehouseID int not null, Operation smallint not null check (Operation in (-1,1)), — +1 приход на склад, -1 расход со склада Quantity numeric(20,2) not null, Cost money not null )
Dt — Дата время поступления/списания на/со склада.
ProductID — Продукт
StorehouseID — склад
Operation — 2 значения приход или расход
Quantity — количество продукта на складе. Может быть вещественным если продукт не в штуках, а, например, в килограммах.
Cost — стоимость партии продукта.

Исследование задачи

Создадим заполненную таблицу. Для того что бы ты мог вместе со мной тестировать и смотреть получившиеся результаты, предлагаю создать и заполнить таблицу dbo.Turnover скриптом:
if object_id(‘dbo.Turnover’,’U’) is not null drop table dbo.Turnover; go with times as ( select 1 id union all select id+1 from times where id < 10*365*24*60 — 10 лет * 365 дней * 24 часа * 60 минут = столько минут в 10 лет ) , storehouse as ( select 1 id union all select id+1 from storehouse where id < 100 — количество складов ) select identity(int,1,1) id, dateadd(minute, t.id, convert(datetime,’20060101′,120)) dt, 1+abs(convert(int,convert(binary(4),newid()))%1000) ProductID, — 1000 — количество разных продуктов s.id StorehouseID, case when abs(convert(int,convert(binary(4),newid()))%3) in (0,1) then 1 else -1 end Operation, — какой то приход и расход, из случайных сделаем из 3х вариантов 2 приход 1 расход 1+abs(convert(int,convert(binary(4),newid()))%100) Quantity into dbo.Turnover from times t cross join storehouse s option(maxrecursion 0); go — 15 min alter table dbo.Turnover alter column id int not null go alter table dbo.Turnover add constraint pk_turnover primary key (id) with(data_compression=page) go — 6 min

У меня этот скрипт на ПК с SSD диском выполнялся порядка 22 минуты, и размер таблицы занял около 8Гб на жестком диске. Ты можешь уменьшить количество лет, и количество складов, для того что бы время создания и заполнения таблицы сократить. Но какой-то неплохой объем для оценки планов запросов рекомендую оставить, хотя бы 1-2 гигабайта.
Сгруппируем данные до часа
Далее, нам нужно сгруппировать суммы по продуктам на складе за исследуемый период времени, в нашей постановке задачи это один час (можно до минуты, до 15 минут, дня. Но очевидно до миллисекунд вряд ли кому понадобится отчетность). Для сравнений в сессии (окне) где выполняем наши запросы выполним команду — set statistics time on;. Далее выполняем сами запросы и смотрим планы запросов:
select top(1000) convert(datetime,convert(varchar(13),dt,120)+’:00′,120) as dt, — округляем до часа ProductID, StorehouseID, sum(Operation*Quantity) as Quantity from dbo.Turnover group by convert(datetime,convert(varchar(13),dt,120)+’:00′,120), ProductID, StorehouseID

Стоимость запроса — 12406
(строк обработано: 1000)
Время работы SQL Server:
Время ЦП = 2096594 мс, затраченное время = 321797 мс.
Если мы сделаем результирующий запрос с балансом, который считается нарастающим итогом от нашего количества, то запрос и план запроса будут следующими:
select top(1000) convert(datetime,convert(varchar(13),dt,120)+’:00′,120) as dt, — округляем до часа ProductID, StorehouseID, sum(Operation*Quantity) as Quantity, sum(sum(Operation*Quantity)) over ( partition by StorehouseID, ProductID order by convert(datetime,convert(varchar(13),dt,120)+’:00′,120) ) as Balance from dbo.Turnover group by convert(datetime,convert(varchar(13),dt,120)+’:00′,120), ProductID, StorehouseID

Стоимость запроса — 19329
(строк обработано: 1000)
Время работы SQL Server:
Время ЦП = 2413155 мс, затраченное время = 344631 мс.
Оптимизация группировки
Здесь достаточно все просто. Сам запрос без нарастающего итога можно оптимизировать материализованным представлением (index view). Для построения материализованного представления, то что суммируется не должно иметь значение NULL, у нас суммируются sum(Operation*Quantity), или каждое поле сделать NOT NULL или добавить isnull/coalesce в выражение. Предлагаю создать материализованное представление.
create view dbo.TurnoverHour with schemabinding as select convert(datetime,convert(varchar(13),dt,120)+’:00′,120) as dt, — округляем до часа ProductID, StorehouseID, sum(isnull(Operation*Quantity,0)) as Quantity, count_big(*) qty from dbo.Turnover group by convert(datetime,convert(varchar(13),dt,120)+’:00′,120), ProductID, StorehouseID go
И построить по нему кластерный индекс. В индексе порядок полей укажем так же как и в группировке (для группировки столько порядок не важен, важно что бы все поля группировки были в индексе) и нарастающем итоге (здесь важен порядок — сначала то, что в partition by, затем то, что в order by):
create unique clustered index uix_TurnoverHour on dbo.TurnoverHour (StorehouseID, ProductID, dt) with (data_compression=page) — 19 min
Теперь после построения кластерного индекса мы можем заново выполнить запросы, изменив агрегацию суммы как в представлении:
select top(1000) convert(datetime,convert(varchar(13),dt,120)+’:00′,120) as dt, — округляем до часа ProductID, StorehouseID, sum(isnull(Operation*Quantity,0)) as Quantity from dbo.Turnover group by convert(datetime,convert(varchar(13),dt,120)+’:00′,120), ProductID, StorehouseID select top(1000) convert(datetime,convert(varchar(13),dt,120)+’:00′,120) as dt, — округляем до часа ProductID, StorehouseID, sum(isnull(Operation*Quantity,0)) as Quantity, sum(sum(isnull(Operation*Quantity,0))) over ( partition by StorehouseID, ProductID order by convert(datetime,convert(varchar(13),dt,120)+’:00′,120) ) as Balance from dbo.Turnover group by convert(datetime,convert(varchar(13),dt,120)+’:00′,120), ProductID, StorehouseID
Планы запросов стали:
Стоимость 0.008
Стоимость 0.01
Время работы SQL Server:
Время ЦП = 31 мс, затраченное время = 116 мс.
(строк обработано: 1000)
Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 151 мс.
Итого, мы видим, что с индексированной вьюхой запрос сканирует не таблицу группируя данные, а кластерный индекс, в котором уже все сгруппировано. И соответственно время выполнения сократилось с 321797 миллисекунд до 116 мс., т.е. в 2774 раза.
На этом бы можно было бы и закончить нашу оптимизацию, если бы не тот факт, что нам нужна зачастую не вся таблица (вьюха) а ее часть за выбранный диапазон.
Промежуточные балансы
В итоге нам нужно быстрое выполнение следующего запроса:
set dateformat ymd; declare @start datetime = ‘2015-01-02’, @finish datetime = ‘2015-01-03’ select * from ( select dt, StorehouseID, ProductId, Quantity, sum(Quantity) over ( partition by StorehouseID, ProductID order by dt ) as Balance from dbo.TurnoverHour with(noexpand) where dt <= @finish ) as tmp where dt >= @start

Стоимость плана = 3103. А представь что бы было, если бы не по материализованному представлению пошел а по самой таблице.
Вывод данных материализованного представления и баланса по каждому продукту на складе на дату со временем округленную до часа. Что бы посчитать баланс — необходимо с самого начала (с нулевого баланса) просуммировать все количества до указанной последней даты (@finish), а после уже в просуммированном резалтсете отсечь данные позже параметра start.
Здесь, очевидно, помогут промежуточные рассчитанные балансы. Например, на 1е число каждого месяца или на каждое воскресенье. Имея такие балансы, задача сводится к тому, что нужно будет суммировать ранее рассчитанные балансы и рассчитать баланс не от начала, а от последней рассчитанной даты. Для экспериментов и сравнений построим дополнительный не кластерный индекс по дате:
create index ix_dt on dbo.TurnoverHour (dt) include (Quantity) with(data_compression=page); —7 min И наш запрос будет вида: set dateformat ymd; declare @start datetime = ‘2015-01-02’, @finish datetime = ‘2015-01-03′ declare @start_month datetime = convert(datetime,convert(varchar(9),@start,120)+’1’,120) select * from ( select dt, StorehouseID, ProductId, Quantity, sum(Quantity) over ( partition by StorehouseID, ProductID order by dt ) as Balance from dbo.TurnoverHour with(noexpand) where dt between @start_month and @finish ) as tmp where dt >= @start order by StorehouseID, ProductID, dt
Вообще этот запрос имея даже индекс по дате полностью покрывающий все затрагиваемые в запросе поля, выберет кластерный наш индекс и сканирование. А не поиск по дате с последующей сортировкой. Предлагаю выполнить следующие 2 запроса и сравнить что у нас получилось, далее проанализируем что все-таки лучше:
set dateformat ymd; declare @start datetime = ‘2015-01-02’, @finish datetime = ‘2015-01-03′ declare @start_month datetime = convert(datetime,convert(varchar(9),@start,120)+’1’,120) select * from ( select dt, StorehouseID, ProductId, Quantity, sum(Quantity) over ( partition by StorehouseID, ProductID order by dt ) as Balance from dbo.TurnoverHour with(noexpand) where dt between @start_month and @finish ) as tmp where dt >= @start order by StorehouseID, ProductID, dt select * from ( select dt, StorehouseID, ProductId, Quantity, sum(Quantity) over ( partition by StorehouseID, ProductID order by dt ) as Balance from dbo.TurnoverHour with(noexpand,index=ix_dt) where dt between @start_month and @finish ) as tmp where dt >= @start order by StorehouseID, ProductID, dt
Время работы SQL Server:
Время ЦП = 33860 мс, затраченное время = 24247 мс.
(строк обработано: 145608)
(строк обработано: 1)
Время работы SQL Server:
Время ЦП = 6374 мс, затраченное время = 1718 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
Из времени видно, что индекс по дате выполняется значительно быстрее. Но планы запросов в сравнении выглядят следующим образом:

Стоимость 1го запроса с автоматически выбранным кластерным индексом = 2752, а вот стоимость с индексом по дате запроса = 3119.
Как бы то не было, здесь нам требуется от индекса две задачи: сортировка и выборка диапазона. Одним индексом из имеющихся нам эту задачу не решить. В данном примере диапазон данных всего за 1 день, но если будет период больше, но далеко не весь, например, за 2 месяца, то однозначно поиск по индексу будет не эффективен из-за расходов на сортировку.
Здесь из видимых оптимальных решений я вижу:

  1. Создать вычисляемое поле Год-Месяц и индекс создать (Год-Месяц, остальные поля кластерного индекса). В условии where dt between @start_month and finish заменить на Год-Месяц=@месяц, и после этого уже наложить фильтр на нужные даты.
  2. Фильтрованные индексы — индекс сам как кластерный, но фильтр по дате, за нужный месяц. И таких индексов сделать столько, сколько у нас месяцев всего. Идея близка к решению, но здесь если диапазон условий будет из 2х фильтрованных индексов, потребуется соединение и в дальнейшем все равно сортировка неизбежна.
  3. Секционируем кластерный индекс так, чтобы в каждой секции были данные только за один месяц.

В проекте в итоге я сделал 3-й вариант. Секционирование кластерного индекса материализованного представления. И если выборка идет за промежуток времени одного месяца, то по сути оптимизатор затрагивает только одну секцию, делая ее сканирование без сортировки. А отсечение неиспользуемых данных происходит на уровне отсечения неиспользуемых секций. Здесь если поиск с 10 по 20 число у нас не идет точный поиск этих дат, а поиск данных с 1го по последний день месяца, далее сканирование этого диапазона в отсортированном индексе с фильтрацией во время сканирования по выставленным датам.
Секционируем кластерный индекс вьюхи. Прежде всего удалим из вьюхи все индексы:
drop index ix_dt on dbo.TurnoverHour; drop index uix_TurnoverHour on dbo.TurnoverHour;
И создадим функцию и схему секционирования:
set dateformat ymd; create partition function pf_TurnoverHour(datetime) as range right for values ( ‘2006-01-01’, ‘2006-02-01’, ‘2006-03-01’, ‘2006-04-01’, ‘2006-05-01’, ‘2006-06-01’, ‘2006-07-01’, ‘2006-08-01’, ‘2006-09-01’, ‘2006-10-01’, ‘2006-11-01’, ‘2006-12-01’, ‘2007-01-01’, ‘2007-02-01’, ‘2007-03-01’, ‘2007-04-01’, ‘2007-05-01’, ‘2007-06-01’, ‘2007-07-01’, ‘2007-08-01’, ‘2007-09-01’, ‘2007-10-01’, ‘2007-11-01’, ‘2007-12-01’, ‘2008-01-01’, ‘2008-02-01’, ‘2008-03-01’, ‘2008-04-01’, ‘2008-05-01’, ‘2008-06-01’, ‘2008-07-01’, ‘2008-08-01’, ‘2008-09-01’, ‘2008-10-01’, ‘2008-11-01’, ‘2008-12-01’, ‘2009-01-01’, ‘2009-02-01’, ‘2009-03-01’, ‘2009-04-01’, ‘2009-05-01’, ‘2009-06-01’, ‘2009-07-01’, ‘2009-08-01’, ‘2009-09-01’, ‘2009-10-01’, ‘2009-11-01’, ‘2009-12-01’, ‘2010-01-01’, ‘2010-02-01’, ‘2010-03-01’, ‘2010-04-01’, ‘2010-05-01’, ‘2010-06-01’, ‘2010-07-01’, ‘2010-08-01’, ‘2010-09-01’, ‘2010-10-01’, ‘2010-11-01’, ‘2010-12-01’, ‘2011-01-01’, ‘2011-02-01’, ‘2011-03-01’, ‘2011-04-01’, ‘2011-05-01’, ‘2011-06-01’, ‘2011-07-01’, ‘2011-08-01’, ‘2011-09-01’, ‘2011-10-01’, ‘2011-11-01’, ‘2011-12-01’, ‘2012-01-01’, ‘2012-02-01’, ‘2012-03-01’, ‘2012-04-01’, ‘2012-05-01’, ‘2012-06-01’, ‘2012-07-01’, ‘2012-08-01’, ‘2012-09-01’, ‘2012-10-01’, ‘2012-11-01’, ‘2012-12-01’, ‘2013-01-01’, ‘2013-02-01’, ‘2013-03-01’, ‘2013-04-01’, ‘2013-05-01’, ‘2013-06-01’, ‘2013-07-01’, ‘2013-08-01’, ‘2013-09-01’, ‘2013-10-01’, ‘2013-11-01’, ‘2013-12-01’, ‘2014-01-01’, ‘2014-02-01’, ‘2014-03-01’, ‘2014-04-01’, ‘2014-05-01’, ‘2014-06-01’, ‘2014-07-01’, ‘2014-08-01’, ‘2014-09-01’, ‘2014-10-01’, ‘2014-11-01’, ‘2014-12-01’, ‘2015-01-01’, ‘2015-02-01’, ‘2015-03-01’, ‘2015-04-01’, ‘2015-05-01’, ‘2015-06-01’, ‘2015-07-01’, ‘2015-08-01’, ‘2015-09-01’, ‘2015-10-01’, ‘2015-11-01’, ‘2015-12-01’, ‘2016-01-01’, ‘2016-02-01’, ‘2016-03-01’, ‘2016-04-01’, ‘2016-05-01’, ‘2016-06-01’, ‘2016-07-01’, ‘2016-08-01’, ‘2016-09-01’, ‘2016-10-01’, ‘2016-11-01’, ‘2016-12-01’, ‘2017-01-01’, ‘2017-02-01’, ‘2017-03-01’, ‘2017-04-01’, ‘2017-05-01’, ‘2017-06-01’, ‘2017-07-01’, ‘2017-08-01’, ‘2017-09-01’, ‘2017-10-01’, ‘2017-11-01’, ‘2017-12-01’, ‘2018-01-01’, ‘2018-02-01’, ‘2018-03-01’, ‘2018-04-01’, ‘2018-05-01’, ‘2018-06-01’, ‘2018-07-01’, ‘2018-08-01’, ‘2018-09-01’, ‘2018-10-01’, ‘2018-11-01’, ‘2018-12-01’, ‘2019-01-01’, ‘2019-02-01’, ‘2019-03-01’, ‘2019-04-01’, ‘2019-05-01’, ‘2019-06-01’, ‘2019-07-01’, ‘2019-08-01’, ‘2019-09-01’, ‘2019-10-01’, ‘2019-11-01’, ‘2019-12-01’); go create partition scheme ps_TurnoverHour as partition pf_TurnoverHour all to (); go Ну и уже известный нам кластерный индекс только в созданной схеме секционирования: create unique clustered index uix_TurnoverHour on dbo.TurnoverHour (StorehouseID, ProductID, dt) with (data_compression=page) on ps_TurnoverHour(dt); — 19 min И теперь посмотрим, что у нас получилось. Сам запрос: set dateformat ymd; declare @start datetime = ‘2015-01-02’, @finish datetime = ‘2015-01-03′ declare @start_month datetime = convert(datetime,convert(varchar(9),@start,120)+’1’,120) select * from ( select dt, StorehouseID, ProductId, Quantity, sum(Quantity) over ( partition by StorehouseID, ProductID order by dt ) as Balance from dbo.TurnoverHour with(noexpand) where dt between @start_month and @finish ) as tmp where dt >= @start order by StorehouseID, ProductID, dt option(recompile);


Время работы SQL Server:
Время ЦП = 7860 мс, затраченное время = 1725 мс.
Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 0 мс.
Стоимость плана запроса = 9.4
По сути данные в одной секции выбираются и сканируются по кластерному индексу достаточно быстро. Здесь следует добавить то, что когда запрос параметризирован, возникает неприятный эффект parameter sniffing, лечится option(recompile).

⇐ Предыдущая1234

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

· Персонал управления и специалисты;

· Оперативные работники (из них продавцы);

· Вспомогательный персонал.

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

Для анализа движения рабочей силы определяются коэффициенты оборота по приему (К n) или выбытию (К в), а также коэффициент общего (суммарного) оборота (К с) по следующим формулам:

K n = R n | R; K в = R в | R; K c = (R n +R в) | R

где R n — число принятых работников;

R в – число выбывших работников;

R — среднесписочная численность работников.

Анализируется также текучесть кадров, возникающая в результате увольнения работников по собственному желанию или за нарушение трудовой дисциплины. Для оценки текучести кадров исчисляется коэффициент ( К т ), определяемый как отношение численности уволенных работников по вышеуказанным причинам (R у ) к среднесписочной численности работников:

К т = R у /R

В процессе анализа наряду с коэффициентом текучести кадров исчисляется и коэффициент стабильности кадров ( К СТ )по формуле

К СТ = 1 — R у /R + R n

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

П = N | R

где П – производительность труда (средний оборот на одного работника);

N – товарооборот;

R – среднесписочная численность работников.

Следовательно, объем товарооборота можно представить произведением численности работников и производительности их труда.

N=R x П

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

Выражается эта зависимость формулой

N=R x Ron | R x N | Ron ;

где R – численность всех работников;

Ron – численность оперативных работников;

Ron | R– соотношение оперативных и всех работников;

N | Ron – производительность труда на одного оперативного работника.

На производительность труда влияет ряд факторов, в том числе объем товарооборота, среднесписочная численность и состав торговых работников.

С ростом товарооборота при неизменной численности работников производительность труда увеличивается, и наоборот. Рост численности работников при неизменном товарообороте влияет на производительность труда отрицательно.

Зависимость производительности труда от состава торговых работников может быть выражена следующим образом:

N|R ,,,= N|R , x R ,, x R ,,| R ,,, ;

где R , – численность продавцов;

R ,, – численность оперативных работников;

R ,,, – численность всех работников.

Анализ влияния факторов на затраты по оплате труда начинается с определения влияния на них численности работников и величины средней заработной платы по следующей формуле:

U = R x C3

где U – затраты на оплату труда;

R – среднесписочная численность работников;

C3 – средняя заработная плата одного работника.

Основную формулу можно преобразовать, заменив численность работников на равнозначную ей величину:

R=N|CO

где N – розничный товарооборот;

CO – средний оборот на одного работника (производительность труда). После такой замены формула примет следующий вид:

U=N x C3|CO

В этом случае можно определить влияние на затраты по оплате труда трех факторов: товарооборота, производительности труда и средней заработной платы.

Задачи:

1. Движение кадров по двум предприятиям, чел.

Показатели Предприятие №1 Предприятие №2
Среднесписочная численность работников
Число выбывших работников за отчётный период
В том числе уволенных за нарушение правил торговли, трудовой дисциплины, и по личным мотивам, не связанным с производственной необходимостью
Число вновь приятных работников за отчётный период

На основании приведенных данных определить следующие показатели ( с точностью до 0,001 единицы):

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

Составить аналитическую таблицу и проанализировать исчисленные показатели.

2. Использование трудовых ресурсов на предприятии.

Показатели План Факт
Среднесписочное число работников, чел.
Среднее количество дней, отработанных одним работником за год, дни
Продолжительность рабочего дня, час. 9,5 9,4
Средний товарооборот на одного работника за один час работы, руб.

На основании приведенных данных определить:

1) Товарооборот по плану и фактически;

2) Общее число отработанных всеми работниками человеко-дней и человеко-часов за год по плану и фактически;

3) Коэффициенты использования рабочего времени и продолжительности рабочего дня;

4) Влияние на отклонение товарооборота от плана изменений четырёх факторов: среднесписочного числа работников; среднего количества дней, отработанных одним работником; продолжительности рабочего дня; товарооборота на одного работника.

Составить аналитическую и обобщающую таблицы, проанализировать исчисленные показатели.

3. Товарооборот и использование рабочих мест.

Показатели Прошлый год Отчетный год
план факт
Товарооборот, тыс. руб.
Среднегодовое количество рабочих мест
Количество рабочих дней в году
Продолжительность рабочего дня, час 8,0 8,5 8,6

На основании приведенных данных определить:

1)среднечасовую выработку на одно рабочее место за прошлый и отчётный годы по плану и фактически;

2)отклонения, проценты выполнения и темпы роста по показателям;

4. Товарооборот и численность работников.

Показатели Прошлый год Отчётный год
Товарооборот, тыс. руб.
Среднегодовые товарные запасы, тыс. руб.
Среднесписочная численность работников, чел.

На основании приведенных данных определить:

1)производительность труда и среднегодовые товарные запасы на одного работника;

2)товарооборачиваемость (в оборотах);

Составить аналитическую и обобщающую таблицы, проанализировать исчисленные показатели.

5. Товарооборот и численность работников.

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

На основании приведенных данных определить:

1)производительность труда на одного работающего и на одного продавца за прошлый и отчётный годы;

2)соотношение продавцов и всех работников за прошлый и отчётный годы;

Составить аналитическую и обобщающую таблицы, проанализировать исчисленные показатели.

⇐ Предыдущая1234

Дата добавления: 2015-09-04; просмотров: 3381. Нарушение авторских прав

Рекомендуемые страницы:

Оборачиваемость запасов (inventory turnover) — показатель обновляемости запасов сырья, материалов и готовой продукции в течение расчетного периода.

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

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

Таким образом оптимальность запасов является обязательным для хозяйственной деятельности компании, а оборачиваемость запасов — показатель, который необходимо постоянно мониторить.

Для контроля оборачиваемости запасов необходимо оперировать тремя показателями:

  • средний товарный запас за период, то есть сколько у нас товаров лежит на складе, например, за месяц;
  • период (месяц, год, неделя — для скоропортящихся товаров);
  • товарооборот за данный период (в ценах складского учета).

Средний товарный запас за период — среднее значение запасов за период (среднегодовое, среднемесячного), определяется как сумма на начало и на конец периода, деленная пополам, хотя возможно и более детальное рассмотрение их изменений в течение периода, например, в отношении месяца:
ТЗср = (Тз1/2 + Тз2 + Тз3 + ТзN/2) / N-1

Где:

ТЗср — средние запасы за период
Тp1 — ТpN — запасы на определенную дату (к примеру: 1 число, 10 число месяца и т.д.);
N — количество точек съема складских запасов (количество дат в периоде).

Обращаю внимание, что в этом случае, при расчете среднего товарного запаса используется формула среднего хронологического, а не среднего арифрметимческого.

Когда говорят об оборачиваемости запасов, могут подразумевать следующие показателя оборачиваемости запасов:

  • коэффициент оборачиваемости запасов;
  • оборачиваемость запасов в днях;
  • оборачиваемость запасов в разах;

Коэффициент оборачиваемости запасов (inventory turnover ratio) — финансовый показатель «западной» учетной системы, рассчитываемый как отношение себестоимости проданных товаров к средней величине запасов за период. Оборачиваемость запасов рассчитывается как отношение себестоимости реализованной продукции или расхода запасов за период к среднему за период объему запасов на складе;

IT = себестоимости проданных товаров / Средние запасы;

Оборачиваемость запасов в днях показывает, сколько дней нужно для продажи среднего складского запаса. Она вычисляется по формуле:
Об дн = Средний товарный запас * кол-во дней / Товарооборот за этот период

Оборачиваемость в разах говорит, сколько раз за период товар «обернулся», продался и запас вновь пополнился на складе. Вычисляется по формулам:
Об раз = Себестоимости проданных товаров / Средний товарный запас за период

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

221 694 просмотра

Товарные запасы – это количество товаров в денежном или натуральном выражении, находящихся в торговых предприятиях, на складах, в пути на определенную дату.

Товарооборачиваемость — время обращения среднего товарного запаса за определенный период.

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

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

Товарные запасы анализируются в целом по предприятию и по каждой товарной группе по данным оперативного учета, а также бухгалтерской и статистической отчетности. Основной задачей анализа является проверка соответствия фактических товарных запасов установленным нормам и выяснение причин отклонений. На основании данных, полученных в ходе анализа, принимаются меры для нормализации товарных запасов.

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

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

Один из наиболее используемых показателей — объем товарных запасов, может измеряться в натуральном и стоимостном выражении. На практике определяют три вида данного показателя:

минимально допустимый объем, свидетельствующий о необходимости пополнения товарных запасов;

максимальный объем, характеризующий предельную величину товарных запасов;

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

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

Первым относительным показателем, применяемым при анализе, является уровень товарных запасов, который измеряется в днях товарооборота по следующим формулам (1):

где

Утз- уровень товарных запасов в днях товарооборота;

ТЗ — товарный запас на конец анализируемого периода (руб.);

Т / ОБобн — однодневный товарооборот за анализируемый период (руб.);

Т / ОБ — объем товарооборота за анализируемый период (руб.);

Д — количество дней в анализируемом периоде.

Уровень товарных запасов характеризует обеспеченность торгового предприятия запасами на определенную дату и показывает — на какое число дней торговли (при сложившемся товарообороте) хватит этого запаса.

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

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

Время товарного обращения, или товарооборачиваемость в днях товарооборота, рассчитывается по следующим формулам (2):

где

ОБбн — товарооборачиваемость в днях товарооборота;

ТЗ — средний товарный запас за исследуемый период (руб.);

Т / ОБобн — однодневный товарооборот за тот же период (руб.);

Т / ОБ — объем товарооборота за указанный период (руб.);

Д — число дней в этом периоде.

Средний товарный запас за анализируемый период рассчитывается по формуле средней хронологической моментного ряда (3):

где

ТЗ — средний товарный запас за определенный период (руб.);

ТЗ1,ТЗ2, … ,ТЗn — величина товарных запасов на отдельные даты анализируемого периода (руб.);

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

Товарооборачиваемость в днях товарооборота показывает время, в течение которого товарные запасы находятся в сфере обращения, т.е. число дней, за которое оборачивается средний товарный запас.

Скорость товарного обращения, или товарооборачиваемость в числе оборотов, рассчитывается по следующим формулам (4):

где

Обр — товарооборачиваемость в числе оборотов;

Обдн — товарооборачиваемость в днях товарооборота;

Т / Об — товарооборот за определенный период (руб.);

ТЗ — средний товарный запас за тот же период (руб.);

Д — число дней в указанном периоде.

Товарооборачиваемость в числе оборотов показывает количество оборотов среднего товарного запаса за анализируемый период.

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

В рознице традиционно применяются три метода анализа и учета товарных запасов:

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

снятие остатков или оперативный учет, т.е. сверка материально ответственными лицами фактического наличия товара с данными товарного счета. Причем подсчитываются не товары, а товарные места (ящики, рулоны, мешки и др.). Затем с учетом соответствующих норм производится пересчет, определяется количество товаров, которое и оценивается по действующим ценам. Недостаток данного метода — меньшая точность, чем при инвентаризации;

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

Результаты анализа могут использоваться для планирования товарных запасов. Заметим, что директивного обязательного планирования товарных запасов на торговых предприятиях не существует. Мелкие предприятия торговли, исходя из объемов деятельности и численности персонала, вообще не планируют товарные запасы или планируют их очень приблизительно. Средние и крупные торговые предприятия вынуждены постоянно следить за динамикой товарооборачиваемости, а следовательно, планировать и нормировать товарные запасы, что является основой для разработки заказов на закупки товаров в ассортиментном разрезе.

Применяются разные методы планирования и нормирования товарных запасов: статистический, технико-экономический, нормативный, экономико-математический, причем наиболее применимы первый и второй методы.

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

увеличивается объем товарооборота и полнее удовлетворяется покупательский спрос;

уменьшаются издержки обращения (расходы на хранение, потери, % за кредит) и увеличивается прибыль;

улучшается финансовое состояние предприятия, так как быстрее высвобождаются средства, вложенные в товар, которые можно направить на расчеты с поставщиками, банком, бюджетом;

увеличивается объем производства товаров.

Список литературы

СТБ 1393-2003 «Торговля. Термины и определения» (в ред. Постановления Белстандарта от 09.12.2003 № 49).

Агапова Т.Н. Оценка деятельности предприятия розничной торговли // Вопросы статистики. -2004 .-№ 8 .-C.87-88.

Байнев В.Ф. Экономика предприятия и организация производства: Учеб. пособие. -Мн.: БГУ, 2003. -192с.

Белоусова Е.А., Валевич Р.П., Давыдова Г.А., и др. Экономика предприятий торговли -Мн.: БГЭУ, 2003. -280c.

Бобров H.В. Анализ новых тенденций в развитии розничной торговли // Маркетинг. -2004 .-№ 2 .-C.83-87.

Виноградова С.Н., Пигунова О.В., Гурская С.П., и др. Организация и технология торговли -Мн.: Выш. шк., 2002. -460c.

Макарова Н. Поиск оптимальных путей. Некоторые аспекты анализа финансового состояния предприятий торговли // Гермес. -2004 .-№ 3 .-C.21-25.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *