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

Откуда: Украина, Киев-Одесса
Сообщений: 182
Добрый день форумчане
Столкнулся с проблемой: Этот запрос должен выгрузить сумму лонгированных и сумму всех договоров за период
В отдельности запросы выгружают правильные значения (нулл значений быть не может), но при применении left join выгружаются в том числе строки с нулл-значениями в полях "месяц", "ЛБ2", "ЛБ3", "вид" и "Премии лонг" ( при этом sum(t10.[76]) выгружается верно )
Запрос к одной таблице.. Нул значения по логике выгружаться не должны
Может кто укажет на ошибку..


declare @datecontractfrom nvarchar (8), @datecontracttill nvarchar (8),@dateENDfrom nvarchar (8), @dateENDtill nvarchar (8), @lb1 nvarchar (50), @vid1 nvarchar (50)
set @dateCONTRACTfrom = '20140101'
set @dateCONTRACTtill = '20140401'

set @lb1 =  N'Банковские продажи' 
set @vid1 = N'%кредитные карты%' 


          select month(t20.[DatePosting]), t20.lb2, t20.lb3, t20.vid, sum(t10.[76]) as 'All', t20.[Премия лонг]
		  from [REPORT].[dbo].[76temp] as t10
		  left join
			(select t2.[DatePosting] ,t2.lb2 as 'lb2', t2.lb3 as 'lb3',t2.[Vid], sum(t2.[76]) as 'Премия лонг'  
		    FROM  [REPORT].[dbo].[76temp] as t1
            inner join [REPORT].[dbo].[76temp] as t2
              on t1. [INSURER] = t2. [INSURER] 
			     and  (t1. [Vid] = t2. [Vid] )  and (t1.Object = t2.Object)
	             and t1.RegistrationNumber =t2.RegistrationNumber
				 where (t2.[ContractNumber] != t1.[ContractNumber])   and t2.lb1 = @lb1
				and (t2.[DatePosting] >=  @dateCONTRACTfrom and t2.[DatePosting] < @dateCONTRACTtill)
				and t2.vid like @vid1
		        and (datediff(day, t1.Dateend, t2.DateContract) <= 30) 
				and (t2.Beneficiary not like N'%рога%' or t2.ExternalChannel not like N'%рога%')
				and (t2.Beneficiary not like N'%копыта%' or t2.ExternalChannel not like N'%копыта%')
				group by  t2.[DatePosting], t2.lb2 ,t2.lb3,t2.[Vid]) as t20
			on  month(t20.[DatePosting])= month(t10.[DatePosting]) and t10.lb2=t20.lb2 and t10.lb3=t20.lb3 
			where t10.lb1 = @lb1 and t10.vid like @vid1
			and (t10.[DatePosting] >=  @dateCONTRACTfrom and t10.[DatePosting] < @dateCONTRACTtill)
			and (t10.Beneficiary not like N'%рога%' or t10.ExternalChannel not like N'%рога%')
			and (t10.Beneficiary not like N'%копыта%' or t10.ExternalChannel not like N'%копыта%')

			group by month(t20.[DatePosting]), t20.lb2, t20.lb3, t20.vid, t20.[Премия лонг]
5 май 14, 15:18    [15974381]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
googlogmob
Member

Откуда: Украина, Киев-Одесса
Сообщений: 182
Добавил пример результата

К сообщению приложен файл. Размер - 147Kb
5 май 14, 15:19    [15974387]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
Glory
Member

Откуда:
Сообщений: 104760
googlogmob
Может кто укажет на ошибку..

Ошибка - в логике ваших рассуждений.
LEFT JOIN как раз и должен возвращать NULL для всех записей таблицы, которым не найдутся совпадения в другой таблице
5 май 14, 15:21    [15974409]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
googlogmob
Member

Откуда: Украина, Киев-Одесса
Сообщений: 182
Glory
googlogmob
Может кто укажет на ошибку..

Ошибка - в логике ваших рассуждений.
LEFT JOIN как раз и должен возвращать NULL для всех записей таблицы, которым не найдутся совпадения в другой таблице


Glory, подскажите пожалуйста, каким образом перестроит запрос чтобы получить такой результат:

Модератор: Вложение удалено.


Сообщение было отредактировано: 5 май 14, 16:33
5 май 14, 15:57    [15974721]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Замените на правый джойн.
5 май 14, 16:01    [15974741]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
Glory
Member

Откуда:
Сообщений: 104760
googlogmob
подскажите пожалуйста, каким образом перестроит запрос чтобы получить такой результат:

вместо left join написать inner join ?
5 май 14, 16:01    [15974746]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
не поможет ему
5 май 14, 16:02    [15974751]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Хотя, так может и не получиться. Джойн внутри подзапроса должен быть не inner, если хотите NULL в колонке суммы.
Непонятно - зачем...
5 май 14, 16:04    [15974761]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
googlogmob
Member

Откуда: Украина, Киев-Одесса
Сообщений: 182
Нужно выгрузить сумму по всем договорам, и суму по лонгированным.
Возможно, в моем запросе допущены ошибки
5 май 14, 16:17    [15974842]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
Glory
Member

Откуда:
Сообщений: 104760
googlogmob
Нужно выгрузить сумму по всем договорам, и суму по лонгированным.

select sum(f1), sum(case when <критерии лонгированного договора> then f1 end)
from mytable
5 май 14, 16:37    [15974981]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
googlogmob
Member

Откуда: Украина, Киев-Одесса
Сообщений: 182
Другими словами, почему используя left join для соединения таблица общих платежей и отфильтрованных (в данном случае лонгированных) получется такой результат, при котором нулл-значения возникают в полях "Месяц", "ЛБ2"?

Каким образом можно переформировать запрос, чтобы этих нулл значений для полей "Месяц", "ЛБ2", "ЛБ3" не было в результате

К сообщению приложен файл. Размер - 101Kb
5 май 14, 16:47    [15975033]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
Glory
Member

Откуда:
Сообщений: 104760
googlogmob
Другими словами, почему используя left join для соединения таблица общих платежей и отфильтрованных (в данном случае лонгированных) получется такой результат, при котором нулл-значения возникают в полях "Месяц", "ЛБ2"?

Потому что нет соответствующих записей для написанного вами условия соединения.

googlogmob
Каким образом можно переформировать запрос, чтобы этих нулл значений для полей "Месяц", "ЛБ2", "ЛБ3" не было в результате

не использовать left join
5 май 14, 16:50    [15975054]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
googlogmob
Member

Откуда: Украина, Киев-Одесса
Сообщений: 182
Glory, значит правильно будет добавить "LB2 is nоt null"?
Сумма в строках, которые выгружается с полями NULL, не удовлетворяют критериям отбора, но по правилам действия left join попадают в результат?
Каким образом можно обойтись без использования left join в этой ситуации?
5 май 14, 17:36    [15975289]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
да нет там у вас правильного варианта, у вас нет никакой связи для таких значений
5 май 14, 17:37    [15975294]     Ответить | Цитировать Сообщить модератору
 Re: Запрос возвражает некоторые строки с NULL значениями  [new]
googlogmob
Member

Откуда: Украина, Киев-Одесса
Сообщений: 182
googlogmob
Glory, значит правильно будет добавить "LB2 is nоt null"?
Сумма в строках, которые выгружается с полями NULL, не удовлетворяют критериям отбора, но по правилам действия left join попадают в результат?
Каким образом можно обойтись без использования left join в этой ситуации?


Увидел вариант select sum(f1), sum(case when <критерии лонгированного договора> then f1 end)
from mytable

Попробую
Спасибо
5 май 14, 17:41    [15975305]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить