Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите упростить и ускорить данный запрос  [new]
Jumabaev1
Member

Откуда:
Сообщений: 15
Данная хранимая процедура для вычисления валовой прибыли за период.
Берутся данные из таблицы "Продажи" и берем последнюю цену покупки в таблице "Покупки"
Помогите пожалуйста упростить и ускорить данный код??

USE [ESEP]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID('dbo.esep_ReportSalesMorjaByDate', 'P' ) IS NOT NULL 
   DROP PROCEDURE dbo.esep_ReportSalesMorjaByDate;
GO

CREATE PROCEDURE [dbo].[esep_ReportSalesMorjaByDate]
	@DateStart		datetime,
	@DateEnd		datetime

AS
BEGIN
	SET NOCOUNT ON;

	SELECT	ps.DocumentNum, MAX(ps.DateTime) as 'DateTime', SUM(ps.Quantity * ps.Price) as 'SaleSum',
			SUM(ps.Quantity *  (SELECT TOP 1 pc.Price
								FROM tbl_ProductsComing pc
								WHERE pc.ProductsID = ps.ProductsID and pc.DateTime <= ps.DateTime
								ORDER BY pc.DateTime DESC)) as 'ComeSum',
			c.Name as 'CustomerName', u.Name as 'UserName'
	FROM	tbl_ProductsSelling ps	INNER JOIN tbl_Customers c ON c.ID = ps.CustomersID
									INNER JOIN tbl_Users u ON u.ID = ps.UsersID
	WHERE	ps.DateTime >= @DateStart and ps.DateTime <= @DateEnd
	GROUP BY ps.DocumentNum, c.Name, u.Name

END
GO
27 май 18, 22:35    [21444731]     Ответить | Цитировать Сообщить модератору
 Re: Помогите упростить и ускорить данный запрос  [new]
982183
Member

Откуда: VL
Сообщений: 3352
А что, с/с товара в строках документа ты не хранишь....
Партионного учета вроде нет
ФИФО?
28 май 18, 05:33    [21445010]     Ответить | Цитировать Сообщить модератору
 Re: Помогите упростить и ускорить данный запрос  [new]
aleks222
Member

Откуда:
Сообщений: 952
CREATE PROCEDURE [dbo].[esep_ReportSalesMorjaByDate]
	@DateStart		datetime,
	@DateEnd		datetime

AS
BEGIN
	SET NOCOUNT ON;

with ps as ( select * from tbl_ProductsSelling where ps.DateTime >= @DateStart and ps.DateTime <= @DateEnd )
   , pc as ( select * from tbl_ProductsComing )
   , x as (	SELECT ps.DocumentNum, MAX(ps.DateTime) as 'DateTime', SUM(ps.Quantity * ps.Price) as 'SaleSum',
			       SUM(ps.Quantity * pc.Price) as 'ComeSum'
                 , ps.CustomersID, ps.UsersID
 	          from ps	
              cross apply ( SELECT TOP 1 Price FROM  pc WHERE pc.ProductsID = ps.ProductsID and pc.DateTime <= ps.DateTime ORDER BY pc.DateTime DESC ) as pc
              GROUP BY ps.DocumentNum, ps.CustomersID, ps.UsersID
          )
    select *
         , c.Name as 'CustomerName', u.Name as 'UserName'
       from x left outer JOIN tbl_Customers c ON c.ID = ps.CustomersID
			  left outer JOIN tbl_Users u ON u.ID = ps.UsersID

END
GO
28 май 18, 05:53    [21445015]     Ответить | Цитировать Сообщить модератору
 Re: Помогите упростить и ускорить данный запрос  [new]
LameUser
Member

Откуда:
Сообщений: 2028
aleks222
CREATE PROCEDURE [dbo].[esep_ReportSalesMorjaByDate]
@DateStart datetime,
@DateEnd datetime

AS
BEGIN
SET NOCOUNT ON;

with ps as ( select * from tbl_ProductsSelling where ps.DateTime >= between @DateStart and ps.DateTime <= @DateEnd )
, pc as ( select * from tbl_ProductsComing )
, x as ( SELECT ps.DocumentNum, MAX(ps.DateTime) as 'DateTime', SUM(ps.Quantity * ps.Price) as 'SaleSum',
SUM(ps.Quantity * pc.Price) as 'ComeSum'
, ps.CustomersID, ps.UsersID
from ps
cross apply ( SELECT TOP 1 Price FROM pc WHERE pc.ProductsID = ps.ProductsID and pc.DateTime <= ps.DateTime ORDER BY pc.DateTime DESC ) as pc
GROUP BY ps.DocumentNum, ps.CustomersID, ps.UsersID
)
select *
, c.Name as 'CustomerName', u.Name as 'UserName'
from x left outer JOIN tbl_Customers c ON c.ID = ps.CustomersID
left outer JOIN tbl_Users u ON u.ID = ps.UsersID

END
GO



Для меньшего количества букав коде.


Немного философии - что двигало создателя процедуры назвать ее "..ReportSalesMorjaByDate",
ведь по логике вещей надо было либо ReportSalesMarginByDate либо OtchetMarjaPoProdajamPoDate
28 май 18, 08:09    [21445122]     Ответить | Цитировать Сообщить модератору
 Re: Помогите упростить и ускорить данный запрос  [new]
Jumabaev1
Member

Откуда:
Сообщений: 15
Спасибо Всем!

Morja - Margin просто не знал тогда.
А вообще оказалось, правильно "Валовая прибыль"
28 май 18, 22:11    [21448419]     Ответить | Цитировать Сообщить модератору
 Re: Помогите упростить и ускорить данный запрос  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Jumabaev1
Данная хранимая процедура для вычисления валовой прибыли за период.
Берутся данные из таблицы "Продажи" и берем последнюю цену покупки в таблице "Покупки"
Помогите пожалуйста упростить и ускорить данный код??

Помогу. Совершенно бесплатным советом. Идете к главному бухгалтеру и выясняете, что закупки идут с НДС, а продажи у Вас розничные например без НДС, что для маржи нужно себестоимость и розничную сумму считать одинаково без НДС или одинаково с НДС, к примеру.

Понимаете? Есть у Вас tbl_ProductsSelling.Price, а есть tbl_ProductsComing.Price, а Вы хотя бы разок сравнили, что за ценники там? Ну и как говорится - что будет, если из чеков нужно протянуть размер скидки (DiscountSum), посчитать сумму продаж без учета скидки или наоборот с учетом скидки и показать реальную прибыль. Потому что Price из tbl_ProductsComing может быть закупочная 10 рублей, Price из tbl_ProductsSelling может быть 100 рублей, реально при каждом факте продаж идет скидка 5% по ДК и скидка 85% по распродаже, прибыль по нулям, а смысл продажи товара не в том, чтобы на нем заработать, а чтобы его по себестоимости вручить клиенту, купить лояльность клиента и к товару с приличной накруткой продать комплектующих (в салонах сотовой связи к примеру к сотовому за маленькую цену навязывают за приличные деньги всяких чехольчиков и внешних аккумуляторов, которые в Китае берутся за копейки)...
29 май 18, 00:23    [21448606]     Ответить | Цитировать Сообщить модератору
 Re: Помогите упростить и ускорить данный запрос  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Jumabaev1
Данная хранимая процедура для вычисления валовой прибыли за период.

Перефразирую - перед тем, как подтягивать скорость выполнения, Вы хотя бы раз проводили подробную сверку с конечными пользователями этих отчетов, что они хотят увидеть в графе "валовая прибыль" и что Вы им там показываете?
29 май 18, 00:25    [21448607]     Ответить | Цитировать Сообщить модератору
 Re: Помогите упростить и ускорить данный запрос  [new]
Jumabaev1
Member

Откуда:
Сообщений: 15
tbl_ProductsComing.Price - это закупочная цена. По сколько поставили товар по столько и оприходовали.
tbl_ProductsSelling.Price - это цена по которой продали в кассе (если была скидка пишем цену со скидкой).
Вычитаем Покупку от Продажи получаем маржу. От маржи вычитаем операционные расход т.е. расходы которые могут составлять себестоимость товара и остаток считаю валовым доходом.
Поправьте пожалуйста если ошибаюсь.
6 июн 18, 09:36    [21471698]     Ответить | Цитировать Сообщить модератору
 Re: Помогите упростить и ускорить данный запрос  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Учет партионный?
База бухучета или оперативная? Если бухучет, то какая система налогообложения?
Операционные расходы раскидываешь пропорционально чему?
6 июн 18, 09:49    [21471729]     Ответить | Цитировать Сообщить модератору
 Re: Помогите упростить и ускорить данный запрос  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Jumabaev1
Поправьте пожалуйста если ошибаюсь.

Еще раз - Вы не поняли. Цена с НДС или без НДС? Вы главбуху показывали это обсуждение?
6 июн 18, 12:08    [21472194]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить