2016-04-29 3 views
0

может кто-нибудь помочь мне выяснить, что я делаю неправильно с этим запросом. Я пытаюсь отфильтровать некоторые записи из таблицы, содержащей электронные письма, отправленные клиентам со статусом электронных писем. Мне нужно устранить все почтовые индексы, которые имеют статус отправленного (1) и отскок (0). Все, кроме этих двух статусов, считается доставленным (4). Таким образом, вывод содержит только EmailId со статусом Delivered (4) для всех этих почтовых индексов, которые не имеют статусов 1 и 0. В приведенном ниже примере я также должен видеть EmailId 4 со статусом отправленногоT-Sql aggregate query

Это мой образец набор up.Really признателен за любую помощь вы, ребята могут предоставить мне

create table #status 
(
    Id int, 
    Name varchar(100) 
) 

insert into #status (Id, Name) 
values (0, 'Bounced'), (1, 'Sent'), (2, 'Clicked'), 
     (3, 'Opened'), (4, 'Delivered') 

create table #email 
(
    EmailId int , 
    Email varchar(100), 
    StatusId int 
) 

insert into #email (EmailId, email, StatusId) 
values (1, '[email protected]', 1), (1, '[email protected]', 0), 
     (2, '[email protected]', 1), (2, '[email protected]', 2), 
     (2, '[email protected]', 3), (3, '[email protected]', 1), 
     (3, '[email protected]', 2), (3, '[email protected]', 3), 
     (4, '[email protected]', 1) 

select 
    e.EmailId 
into 
    #temp 
from 
    #email e 
inner join #status st 
    on st.Id = e.StatusId 
where 
    (e.StatusId not in (1,0)) 
group by 
    e.EmailId 

drop table #temp 
drop table #email 
drop table #status 
+0

Я смущен тем, что вы пытаетесь достичь. Это, кажется, довольно простой запрос, но с ненужным сложным решением. У вас есть несколько операторов SELECT, возвращающих три отдельных набора результатов. Если вы просто пытаетесь отфильтровать 0 и 1 статусы, вы уже делаете это в своем первом запросе SELECT (за исключением того, что вы вставляете эти строки во временную таблицу, чтобы вы никогда их не видели). –

+0

@ Boyd, я просто избавился от лишних высказываний, которые у меня были. Я пытаюсь устранить любой EmaiId, который имеет как 0, так и 1 статус. Все, кроме тех, которые должны отображаться с помощью EmailId в одной колонке и Status of Delivered (4)) в следующем столбце (Нет дубликатов EmailIds). Я не вижу EmailId 4 с моим запросом aggreate –

+0

Ahh, я вижу. Причина, по которой вы не видите EmailID 4, состоит в том, что вы отфильтровываете ее с помощью WHERE e.StatusId NOT IN (1,0). Это инструкция OR, по существу говоря «где statusID не 1 ИЛИ 0». Я отправлю ответ. –

ответ

2

Это своего рода запутано способ добраться до этого (вы можете сделать это без временных таблиц, но я делаю это здесь следуйте своему синтаксису). Первый запрос хватает строк, которые матч 1 и 0. второй запрос возвращает идентификаторы электронной почты, которые не существуют в первом запросе:

SELECT EmailID 
INTO #temp 
FROM #email 
WHERE StatusID = 0 
AND EXISTS (SELECT 1 FROM #email WHERE StatusID = 1) 

SELECT DISTINCT e.EmailID 
FROM #email AS e LEFT JOIN #temp AS t 
ON e.EmailID = t.EmailID 
WHERE t.EmailID IS NULL 

КСТАТИ: Меню 1 FROM ... не имеет ничего общего с идентификатором состояния №1. Это может показаться запутанным, потому что я использовал SELECT 1, но это мог быть SELECT 5 или SELECT 'Z'. Это в основном бессмысленно.

Вот тот же самый запрос без временной таблицы:

SELECT DISTINCT e.EmailID 
FROM #email AS e 
WHERE e.EmailID NOT IN (
    SELECT EmailID 
    FROM #email 
    WHERE StatusID = 0 
    AND EXISTS (SELECT 1 FROM #email WHERE StatusID = 1) 
) 
+0

, спасибо большое. У меня есть отправная точка с этим запросом, чтобы исправить мою большую проблему. Очень ценю, что вы помогаете мне –