Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3384 |
А что, с/с товара в строках документа ты не хранишь.... Партионного учета вроде нет ФИФО? |
28 май 18, 05:33 [21445010] Ответить | Цитировать Сообщить модератору |
aleks222 Member Откуда: Сообщений: 1291 |
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] Ответить | Цитировать Сообщить модератору |
LameUser Member Откуда: Сообщений: 2028 |
Для меньшего количества букав коде. Немного философии - что двигало создателя процедуры назвать ее "..ReportSalesMorjaByDate", ведь по логике вещей надо было либо ReportSalesMarginByDate либо OtchetMarjaPoProdajamPoDate |
||
28 май 18, 08:09 [21445122] Ответить | Цитировать Сообщить модератору |
Jumabaev1 Member Откуда: Сообщений: 15 |
Спасибо Всем! Morja - Margin просто не знал тогда. А вообще оказалось, правильно "Валовая прибыль" |
28 май 18, 22:11 [21448419] Ответить | Цитировать Сообщить модератору |
Andy_OLAP Member Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион Сообщений: 3151 |
Помогу. Совершенно бесплатным советом. Идете к главному бухгалтеру и выясняете, что закупки идут с НДС, а продажи у Вас розничные например без НДС, что для маржи нужно себестоимость и розничную сумму считать одинаково без НДС или одинаково с НДС, к примеру. Понимаете? Есть у Вас tbl_ProductsSelling.Price, а есть tbl_ProductsComing.Price, а Вы хотя бы разок сравнили, что за ценники там? Ну и как говорится - что будет, если из чеков нужно протянуть размер скидки (DiscountSum), посчитать сумму продаж без учета скидки или наоборот с учетом скидки и показать реальную прибыль. Потому что Price из tbl_ProductsComing может быть закупочная 10 рублей, Price из tbl_ProductsSelling может быть 100 рублей, реально при каждом факте продаж идет скидка 5% по ДК и скидка 85% по распродаже, прибыль по нулям, а смысл продажи товара не в том, чтобы на нем заработать, а чтобы его по себестоимости вручить клиенту, купить лояльность клиента и к товару с приличной накруткой продать комплектующих (в салонах сотовой связи к примеру к сотовому за маленькую цену навязывают за приличные деньги всяких чехольчиков и внешних аккумуляторов, которые в Китае берутся за копейки)... |
||
29 май 18, 00:23 [21448606] Ответить | Цитировать Сообщить модератору |
Andy_OLAP Member Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион Сообщений: 3151 |
Перефразирую - перед тем, как подтягивать скорость выполнения, Вы хотя бы раз проводили подробную сверку с конечными пользователями этих отчетов, что они хотят увидеть в графе "валовая прибыль" и что Вы им там показываете? |
||
29 май 18, 00:25 [21448607] Ответить | Цитировать Сообщить модератору |
Jumabaev1 Member Откуда: Сообщений: 15 |
tbl_ProductsComing.Price - это закупочная цена. По сколько поставили товар по столько и оприходовали. tbl_ProductsSelling.Price - это цена по которой продали в кассе (если была скидка пишем цену со скидкой). Вычитаем Покупку от Продажи получаем маржу. От маржи вычитаем операционные расход т.е. расходы которые могут составлять себестоимость товара и остаток считаю валовым доходом. Поправьте пожалуйста если ошибаюсь. |
6 июн 18, 09:36 [21471698] Ответить | Цитировать Сообщить модератору |
982183 Member Откуда: VL Сообщений: 3384 |
Учет партионный? База бухучета или оперативная? Если бухучет, то какая система налогообложения? Операционные расходы раскидываешь пропорционально чему? |
6 июн 18, 09:49 [21471729] Ответить | Цитировать Сообщить модератору |
Andy_OLAP Member Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион Сообщений: 3151 |
Еще раз - Вы не поняли. Цена с НДС или без НДС? Вы главбуху показывали это обсуждение? |
||
6 июн 18, 12:08 [21472194] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |