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

Откуда:
Сообщений: 153
Мне нужно реализовать непростую логику в ms sql .

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


Как это вообще сделать возможно, хоть путь подскажите.

Сейчас такая ХП вытаскивает все прямые расходы и доходы по статьям помесячно


ALTER  PROCEDURE [dbo].[getFinPLmonthDirectProekt]		 
		@proekt nvarchar(50) 
AS
begin

	SET NOCOUNT ON;
	 
	  
 ;WITH mm(a) AS
 (
	SELECT number FROM master..spt_values WHERE type = 'p'
 ), grp AS 
 (
	SELECT 	
		OriginFrom = [project].dataS,
		OriginInto =[project]. dataPo,
		[dataS] = 
				CASE 
					WHEN b.a = 0 
					THEN [project].dataS 
					ELSE CAST(DATEADD(month, DATEDIFF(month, 0, DATEADD(month,b.a,[project].dataS)), 0) as date)
				END,
		[dataPo] = 
				CASE 
					WHEN EOMONTH(DATEADD(month,b.a,[project].dataS)) > [project].dataPo
					THEN [project].dataPo
					ELSE EOMONTH(DATEADD(month,b.a,[project].dataS))
				END,
		exp	,
		[nds],
		A.[tip], 
		[vid],
		[finBookProject].nomDoc,	
		[finBookProject].summa,
		[analitiki].name as expName,
		[analitiki].tipPL,
		[analitiki].tipText 

	FROM [finBook] AS A
	Left   JOIN 
	[finBookProject] ON   A.operation = [finBookProject].operation and  A.nomDoc =  [finBookProject].nomDoc INNER JOIN 
	[project] ON [finBookProject].projectKod = [project].kod and [project].actualnost=1  
	INNER JOIN
		mm	AS b
	ON	b.a	<= DATEDIFF(month,0,[project].dataPo) - DATEDIFF(month,0,[project].datas)
	INNER JOIN
	[analitiki] ON exp=[analitiki] .[kod] 
	 
	WHERE  A.actualnost=1  and A.tip<2 and [project].kod=@proekt
)

SELECT 
	
	CONVERT(INT, CONVERT(DATETIME,DATEADD(month, DATEDIFF(month, 0, dataS), 0))) as PLmonth,
	months.nameMonth,	 
	exp,	
	[tip],
	[vid],
	expName,
	tipPL,
	tipText, 
	SUM (CAST(ROUND(1.* summa/(100+nds)*100 * (1 + DATEDIFF(day,dataS,DataPo)) /(1 + DATEDIFF(day,OriginFrom,OriginInto)),2) as money)) as value
	--,nomDoc,OriginFrom,	OriginInto,	summaZakrit/(100+nds)*100 

FROM grp INNER JOIN 
	months ON months.firtstDay=DATEADD(month, DATEDIFF(month, 0, dataS), 0)

 

GROUP BY  expName, CONVERT(INT, CONVERT(DATETIME,DATEADD(month, DATEDIFF(month, 0, dataS), 0))), nameMonth,exp,tip,[vid], tipPL, tipText, DATEADD(month, DATEDIFF(month, 0, dataS), 0)
--,nomDoc,OriginFrom,OriginInto,	summaZakrit/(100+nds)*100
 order by PLmonth	
8 апр 19, 01:39    [21855366]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2374
ilshatkin,

разбейте задачу на маленькие, и так и делайте
1) вычислить долю (например в отедльную таблицу)
2) воздействовать этой долей
3) формирование отчета
8 апр 19, 10:29    [21855531]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить