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

Откуда:
Сообщений: 154
Помогите, пожалуйста, написать, который
1. выберет из таблицы строки входящие в выбранный период
2. распределит в выбранном периоде суммы по месяцам по количеству дней. Суммы округлять до копеек

Готов отблагодарить материально, можно писать на почту ilshatkin@mail.ru

Исходная таблица
dataS dataPo exp nomDoc summaZakrit
01.01.2018 31.03.2018 ВГ001 584 3 000,00
01.03.2018 30.04.2018 НР002 586 5 000,00
01.02.2018 28.02.2018 ПДР01 587 10 000,00
15.01.2018 15.02.2018 ВГ001 588 2 000,00

На выходе должно получится,
для периода 01.01.2018 – 31.03.2018

data1 data2 exp nomDoc summaZakrit
01.01.2018 31.01.2018 ВГ001 584 1 033,33
01.02.2018 28.02.2018 ВГ001 584 933,33
01.03.2018 31.03.2018 ВГ001 584 1 033,33
01.03.2018 31.03.2018 НР002 586 2 540,98
01.02.2018 28.02.2018 ПДР01 587 10 000,00
01.01.2018 31.01.2018 ВГ001 588 1 062,50
01.02.2018 28.02.2018 ВГ001 588 937,5
22 фев 19, 11:09    [21817103]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ilshatkin,

DECLARE @T TABLE
(
	dataS		date,
	dataPo		date,
	exp		VARCHAR(10),
	nomDoc		VARCHAR(10),
	summaZakrit	money
)
INSERT INTO @T
(
	dataS		,
	dataPo 		,
	exp 		,
	nomDoc 		,
	summaZakrit 
)
VALUES
('01 jan 2018', '31 mar 2018',  'ВГ001', '584 ', 3000.00 ),
('01 mar 2018', '30 apr 2018',  'НР002', '586 ', 5000.00 ),
('01 feb 2018', '28 feb 2018',  'ПДР01', '587 ', 10000.00),
('15 jan 2018', '15 feb 2018',  'ВГ001', '588 ', 2000.00 )

; WITH mm(a) AS
 (
	SELECT number FROM master..spt_values WHERE type = 'p'
 ), grp AS 
 (
	SELECT 	
		OriginFrom = dataS,
		OriginInto = dataPo,
		[dataS] = 
				CASE 
					WHEN b.a = 0 
					THEN dataS 
					ELSE CAST(DATEADD(month, DATEDIFF(month, 0, DATEADD(month,b.a,dataS)), 0) as date)
				END,
		[dataPo] = 
				CASE 
					WHEN EOMONTH(DATEADD(month,b.a,dataS)) > dataPo
					THEN dataPo
					ELSE EOMONTH(DATEADD(month,b.a,dataS))
				END,
		exp	,
		nomDoc 	,	
		summaZakrit
	
		--
	FROM 
		@T	AS A
	INNER JOIN
		mm	AS b
	ON	b.a	<= MONTH(dataPo) - MONTH(datas) 
	WHERE
		a.dataS	<= '31 mar 2018' 
	AND	a.dataPo	>= '01 jan 2018'
)
SELECT 
	dataS		,
	dataPo 		,
	exp 		,
	nomDoc 		,
	summaZakrit	,
	CAST(ROUND(1.* SUMMAZakrit * (1 + DATEDIFF(day,dataS,DataPo)) /(1 + DATEDIFF(day,OriginFrom,OriginInto)),2) as money)
FROM grp
22 фев 19, 11:34    [21817129]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
TaPaK,
выдает результат
2018-01-01 2018-01-31 ВГ001 584 3000.00 1033.33
2018-02-01 2018-02-28 ВГ001 584 3000.00 933.33
2018-03-01 2018-03-31 ВГ001 584 3000.00 1033.33
2018-03-01 2018-03-31 НР002 586 5000.00 2540.98
2018-04-01 2018-04-30 НР002 586 5000.00 2459.02
2018-02-01 2018-02-28 ПДР01 587 10000.00 10000.00
2018-01-15 2018-01-31 ВГ001 588 2000.00 1062.50
2018-02-01 2018-02-15 ВГ001 588 2000.00 937.50


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

Так же, если выставить период допустим до конца февраля, то все равно присутствует март.
Но тоже вроде как решается добавив
WHERE
		dataS	<= '28.02.2018' 
	AND	dataPo	>= '01.01.2018'


Еще по тестирую, если в итоге все норм с меня на пиво
22 фев 19, 12:31    [21817209]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
ilshatkin,

автор
в последних двух строках, период не начало и не коне

для меня это неявное условие

автор
Так же, если выставить период допустим до конца февраля, то все равно присутствует март.
Но тоже вроде как решается добавив

добавляйте в итоговый
22 фев 19, 12:36    [21817214]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
ilshatkin
Member

Откуда:
Сообщений: 154
Покрутил, повертел, то что нужно! Два пива этому господину! эквивалент 1000 рублев

TaPaK, напиши, пожалуйста, куда скинуть на почту ilshatkin@mail.ru
22 фев 19, 21:19    [21817668]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
nullin
Member

Откуда: pullin
Сообщений: 174
ilshatkin, у Вас от dataS к dataPo нет перехода между годами и соответственно для периода выбора?
24 фев 19, 12:11    [21818115]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
nullin
ilshatkin, у Вас от dataS к dataPo нет перехода между годами и соответственно для периода выбора?

MONTH(dataPo) - MONTH(datas) заменить на DATEDIFF(month,0,dataPo) - DATEDIFF(month,0,datas)
24 фев 19, 16:19    [21818197]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить