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

Откуда: Украина, Киев-Одесса
Сообщений: 182
нужно выгрузить список email-адресов, которые встречаются в запросе больше двух раз (запрос состоит из двух подзапросов для двух отдельных таблиц. Необходимо получить список адресов тех сотрудников, которые значатся в обеих таблицах одновременно)

пошел двумя путями, но пока в каждом имеются проблемы

1) Способ. Использование "having count (s.[email]) =2" возвращает ошибку "Тип данных операнда ntext недопустим для оператора count."

select s.[email] from  [Access_BD]...[Платежи_Индивидуальная ЛБ_Розница] p
		right join [Access_BD]...[ЦП]  c on p.[id_ЦП]=c.[Код]   and p.[Дата]=@date1
		inner join [Access_BD]...[Сотрудники] s on c.[id_Сотрудник]=s.[Код] and c.[id_ЛБ] in ( @lb2)
	where  p.[Код] is null 
union all
	select s.[email]  from  [Access_BD]...[Платежи_Индивидуальная ЛБ_SME] p
		right join [Access_BD]...[ЦП]  c on p.[id_ЦП]=c.[Код]   and p.[Дата]=@date1
		inner join [Access_BD]...[Сотрудники] s on c.[id_Сотрудник]=s.[Код] and c.[id_ЛБ] in ( @lb3)
	where  p.[Код] is null 
--	having count (s.[email]) =2


2) Способ. Результат выгружается в двух полонках. Но пока не хватает знаний, как свести все значения этих двух колонок в одну.
Но даже когда это удастся, не факт что получится применить "having count ([email]) =2"..

select t1.[email],t2.[email]
from (
	select s.[email] as 'email', s.[Код] from  [Access_BD]...[Платежи_Индивидуальная ЛБ_Розница] p
		right join [Access_BD]...[ЦП]  c on p.[id_ЦП]=c.[Код]   and p.[Дата]=@date1
		inner join [Access_BD]...[Сотрудники] s on c.[id_Сотрудник]=s.[Код] and c.[id_ЛБ] in ( @lb2)
	where  p.[Код] is null ) as t1
full join
	(select s.[email] as 'email',s.[Код]  from  [Access_BD]...[Платежи_Индивидуальная ЛБ_SME] p
		right join [Access_BD]...[ЦП]  c on p.[id_ЦП]=c.[Код]   and p.[Дата]=@date1
		inner join [Access_BD]...[Сотрудники] s on c.[id_Сотрудник]=s.[Код] and c.[id_ЛБ] in ( @lb3)
	where  p.[Код] is null ) as t2
	on t1.[Код]=t2.[Код]
--	having count ([email]) =2


Буду очень благодарен за дельный совет
9 июн 14, 14:13    [16142485]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
iap
Member

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

s.[email] может быть NULL?

Версия сервера - ??
9 июн 14, 14:16    [16142503]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104751
googlogmob
1) Способ. Использование "having count (s.[email]) =2" возвращает ошибку "Тип данных операнда ntext недопустим для оператора count."

А зачем вы в count засунули ntext поле ?
9 июн 14, 14:18    [16142534]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
zrb
Member

Откуда:
Сообщений: 3
googlogmob,

а разве так не получается?

select t1.[email],t2.[email]
from (
select s.[email] as 'email', s.[Код] from [Access_BD]...[Платежи_Индивидуальная ЛБ_Розница] p
right join [Access_BD]...[ЦП] c on p.[id_ЦП]=c.[Код] and p.[Дата]=@date1
inner join [Access_BD]...[Сотрудники] s on c.[id_Сотрудник]=s.[Код] and c.[id_ЛБ] in ( @lb2)
where p.[Код] is null ) as t1
full join
(select s.[email] as 'email',s.[Код] from [Access_BD]...[Платежи_Индивидуальная ЛБ_SME] p
right join [Access_BD]...[ЦП] c on p.[id_ЦП]=c.[Код] and p.[Дата]=@date1
inner join [Access_BD]...[Сотрудники] s on c.[id_Сотрудник]=s.[Код] and c.[id_ЛБ] in ( @lb3)
where p.[Код] is null ) as t2
on t1.[Код]=t2.[Код]
where t1.[email] is not null and t2.[email] not null
9 июн 14, 15:02    [16142961]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
googlogmob
Member

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

s.[email] может быть NULL?

Версия сервера - ??

может
@version = 11, @build = 2100
9 июн 14, 16:50    [16144034]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
googlogmob
Member

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

а разве так не получается?

select t1.[email],t2.[email]
from (
select s.[email] as 'email', s.[Код] from [Access_BD]...[Платежи_Индивидуальная ЛБ_Розница] p
right join [Access_BD]...[ЦП] c on p.[id_ЦП]=c.[Код] and p.[Дата]=@date1
inner join [Access_BD]...[Сотрудники] s on c.[id_Сотрудник]=s.[Код] and c.[id_ЛБ] in ( @lb2)
where p.[Код] is null ) as t1
full join
(select s.[email] as 'email',s.[Код] from [Access_BD]...[Платежи_Индивидуальная ЛБ_SME] p
right join [Access_BD]...[ЦП] c on p.[id_ЦП]=c.[Код] and p.[Дата]=@date1
inner join [Access_BD]...[Сотрудники] s on c.[id_Сотрудник]=s.[Код] and c.[id_ЛБ] in ( @lb3)
where p.[Код] is null ) as t2
on t1.[Код]=t2.[Код]
where t1.[email] is not null and t2.[email] not null



Ха, таки да!)
Так и сделал:
declare @date1 date= '20140605' 
declare @lb1 int = '1'  
declare @lb2 int = '2'  
declare @lb3 int = '3' 

select t1.[email] as 'email'
from (
	select s.[email] as 'email', s.[Код] from  [Access_BD]...[Платежи_Индивидуальная ЛБ_Розница] p
		right join [Access_BD]...[ЦП]  c on p.[id_ЦП]=c.[Код]   and p.[Дата]=@date1
		inner join [Access_BD]...[Сотрудники] s on c.[id_Сотрудник]=s.[Код] and c.[id_ЛБ] in ( @lb2)
	where  p.[Код] is null ) as t1
full join
	(select s.[email] as 'email',s.[Код]  from  [Access_BD]...[Платежи_Индивидуальная ЛБ_SME] p
		right join [Access_BD]...[ЦП]  c on p.[id_ЦП]=c.[Код]   and p.[Дата]=@date1
		inner join [Access_BD]...[Сотрудники] s on c.[id_Сотрудник]=s.[Код] and c.[id_ЛБ] in ( @lb3)
	where  p.[Код] is null ) as t2
	on t1.[Код]=t2.[Код]
	where (t1.[email] is not null and t2.[email] is not null)

После выполнении условия where (t1.[email] is not null and t2.[email] is not null) как раз и формируется список email-адресов пользователей, которые фигурируют в обеих подзапросах (значений поля t1.[email] и t1.[email] является равнозначными)

Спасибо большое zrb, iap,Glory
9 июн 14, 17:00    [16144142]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 47107
googlogmob
iap
googlogmob,

s.[email] может быть NULL?

Версия сервера - ??

может
@version = 11, @build = 2100
Тогда
1. Перейти от NTEXT к NVARCHAR(MAX) (NTEXT всё равно скоро помрёт, да и геморроя с ним много)
2. Написать COUNT(SUBSTRING(s.[email],1,0)) что ли, если действительно надо посчитать неNULLы.
Какое-нибудь выражение, короче говоря, которое при s.[email] IS NULL возвращает NULL, и имеет нормальный тип.
Или SUM(CASE WHEN s.[email] IS NULL THEN 0 ELSE 1 END).
Как то выкрутиться можно...

P.S. Ваш запрос не смотрел, среагировал только на ошибку.
9 июн 14, 17:04    [16144178]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
googlogmob
Member

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

может
@version = 11, @build = 2100
Тогда
1. Перейти от NTEXT к NVARCHAR(MAX) (NTEXT всё равно скоро помрёт, да и геморроя с ним много)
2. Написать COUNT(SUBSTRING(s.[email],1,0)) что ли, если действительно надо посчитать неNULLы.
Какое-нибудь выражение, короче говоря, которое при s.[email] IS NULL возвращает NULL, и имеет нормальный тип.
Или SUM(CASE WHEN s.[email] IS NULL THEN 0 ELSE 1 END).
Как то выкрутиться можно...

P.S. Ваш запрос не смотрел, среагировал только на ошибку.


Та получилось обойтись при помощи условия (t1.[email] is not null and t2.[email] is not null) в варианте запроса через full join
Но спасибо за варианты. Я вот тоже подумывал в сторону таких конструкций, но все оказалось немного проще.
Я не додумал решение.
9 июн 14, 17:17    [16144293]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить