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

Откуда:
Сообщений: 97
Здравствуйте, подскажите, что не так делаю в запросе ?
Каждый месяц начисляется 1000 руб.
Нужно получить нарастающую сумму начислений помесячно и нарастающую сумму оплат, начиная с января
100 руб. внесено в феврале каждого года, начиная 2010 г. Всего четыре оплаты, за четыре года
Подселект делать не хочется, как то объединением хотелось бы обойтись

DECLARE @dl_id INT
SET @dl_id = 3718			-- Ид договора

	SELECT 
		      [Ид месяца] = PG.pg_id
			, [Сумма плановых начислений за все месяцы по текущий] = ISNULL ( SUM(PGSUM.Sum_plan), 0 )
			, [Сумма оплат] = ISNULL ( SUM(P.Total), 0)
	FROM 
		 pay.Pays_Graph PGSUM			-- таблица помесячно
		,pay.Pays_Graph PG				-- таблица она же
		 
    LEFT JOIN DocLease.ValuesForPayGraph(GETDATE()) DV ON DV.dl_id = PG.dl_id		-- таб. с параметрами (неважно для вопроса)
    LEFT JOIN pay.Pays P ON
						      P.obj_id =  PG.dl_id		-- Ид договора
						AND P.obj_type = DV.dl_type		-- незначимое условие		
						AND P.IsPeni = 0				-- незначимое условие		
						AND P.archive = 0			-- незначимое условие		
						AND P.[date] <= pay.DateEnd(PG.pg_id,PG.dl_id,DV.maxPart,DV.type_pay_period, DV.dl_type)	-- дата платежа менее, чем окончание месяца
				

    WHERE PG.dl_id = @dl_id							-- Ид договора
     AND PG.dl_id = PGSUM.dl_id						-- Ид договора
	  AND PG.pg_id >= PGSUM.pg_id					-- Ид месяца
	  AND DV.dl_id = PG.dl_id						-- Ид договора
	GROUP BY  PG.pg_id,	PG.dl_id					-- Группируем по месяцам и договору

------------------------------------------------------------------------------------------------------------------
-- В результате выдает вот это, начиная с января:

[Ид месяца][Сумма плановых начислений за все месяцы по текущий] [Сумма оплат]

150492 1000.00000 0.00000
150493 2000.00000 200.00000
150494 3000.00000 300.00000
150495 4000.00000 400.00000
150496 5000.00000 500.00000
150497 6000.00000 600.00000

------------------------------------------------------------------------------------------------------------------
Должно быть так:

150492 1000.00000 0.00000
150493 2000.00000 100.00000
150494 3000.00000 100.00000
150495 4000.00000 100.00000
150496 5000.00000 100.00000
150497 6000.00000 100.00000

Сообщение было отредактировано: 28 мар 13, 12:59
28 мар 13, 12:32    [14106498]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про объединения  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Виктор_sql,

ошибка у вас в 13 строке в функции pay.DateEnd
28 мар 13, 13:04    [14106711]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про объединения  [new]
Glory
Member

Откуда:
Сообщений: 104760
- Если SUM(P.Total) не нужна, то зачем эта функция написана в запросе ?
- Если уже есть LEFT JOIN DocLease.ValuesForPayGraph(GETDATE()) DV ON DV.dl_id = PG.dl_id , то зачем еще
WHERE DV.dl_id = PG.dl_id ?
- Зачем нужна GROUP BY PG.dl_id, если этого поле не выводится в результатах ?
- Зачем смешан ситаксис соединений ?
28 мар 13, 13:09    [14106758]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про объединения  [new]
Виктор_sql
Member

Откуда:
Сообщений: 97
Glory, вы правы:
- WHERE DV.dl_id = PG.dl_id излишне, если уже есть в джойне .
- группировка по PG.dl_id(ид договора) нужна, поле это в селекте пока не выведено, но в дальнейшем понадобится.
- смешан синтаксис соединений, тут не понял, где что не так.
- SUM(P.Total), замышлялось, что это сумма всех платежей по предыдущим месяцам, вплоть до текущего. Т.е. если в феврале оплатили 100 руб., а в марте 50 руб, например, то
за февраль [Сумма оплат] = 100р., за март 150 р., т.е. оплаты складываются.
Более того, если я уберу таб. с алиасом PGSUM, то считает [Сумма оплат] именно так, как нужно, только нам и [Сумма плановых начислений за все месяцы по текущий] тоже нужна.
28 мар 13, 14:19    [14107320]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про объединения  [new]
Виктор_sql
Member

Откуда:
Сообщений: 97
WarAnt,
что не так с этим условием ? Подставлял дату впрямую вместо ф-ции, все равно двоит, 200 руб. вместо ста.
28 мар 13, 14:22    [14107340]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про объединения  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Виктор_sql
- смешан синтаксис соединений, тут не понял, где что не так.
Запятую и JOIN во FROMе одновременно применять не рекомендуется
28 мар 13, 14:22    [14107341]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про объединения  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Виктор_sql
WarAnt,
что не так с этим условием ? Подставлял дату впрямую вместо ф-ции, все равно двоит, 200 руб. вместо ста.


Не так то, что мы не знаем структуру таблиц, нет примера данных и приходится угадывать, что у вас там спрятано в базе.
Вот я наугад и сказал что у вас где не так. И судя по вашему ответу недалеко от правды угадал:)

Привидете пример данных из таблиц pay.Pays_Graph, pay.Pays, и чего возвращают функции DocLease.ValuesForPayGraph, pay.DateEnd
тогда может чтот получится порекомендовать.

И да Вопросы Глори тоже советую принять во внимание, особенно смешение синтаксиса соединений.
28 мар 13, 16:17    [14108402]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про объединения  [new]
Glory
Member

Откуда:
Сообщений: 104760
Виктор_sql
- группировка по PG.dl_id(ид договора) нужна, поле это в селекте пока не выведено, но в дальнейшем понадобится.

Железно. Может тогда еще пару полей добавить в группировку ?

Виктор_sql
- SUM(P.Total), замышлялось, что это сумма всех платежей по предыдущим месяцам, вплоть до текущего. Т.е. если в феврале оплатили 100 руб., а в марте 50 руб, например, то
за февраль [Сумма оплат] = 100р., за март 150 р., т.е. оплаты складываются.

Считать такие цифры нужно в отдельных запросах. Которые соединять после вычислений, а не до.
28 мар 13, 16:22    [14108456]     Ответить | Цитировать Сообщить модератору
 Re: Запрос про объединения  [new]
Виктор_sql
Member

Откуда:
Сообщений: 97
Спасибо за ответы. Заработало, сделал разными запросами и соединил
28 мар 13, 17:30    [14108955]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить