任何人都可以帮助我弄清楚我在做这个查询有什么问题。我试图从表中包含发送给客户端的电子邮件的一些记录与电子邮件的状态。我需要消除状态为已发送(1)和退回(0)的所有EmailId。除了这两种状态以外的任何情况均视为已交付(4)。因此,输出仅包含EmailId,状态为Delivery(4),表示状态为1和0的所有EmailId。在下面的示例中,我也应该看到EmailId 4,状态为DeliveredT-SQL集合查询
这是我的样本集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
我很困惑。这似乎是一个非常简单的要求,但带有不必要的复杂解决方案。您有多个SELECT语句返回三个单独的结果集。如果您只是试图过滤出0和1个状态,那么您已经在第一个SELECT查询中这样做了(除了将这些行插入临时表中,因此您从不会看到它们)。 –
@ Boyd,我刚刚摆脱了我有的额外选择语句。我试图消除任何具有0和1 statusIds的EmaiId。除了那些应该在一列中显示EmailId和状态交付(4) )在下一列(没有重复EmailIds)。我没有看到EmailId 4与我的聚合查询 –
啊,我明白了。您没有看到EmailID 4的原因是因为您使用WHERE e.StatusId NOT IN(1,0)进行过滤。这是一个OR语句,基本上说“statusID不是1或0”。我会发布一个答案。 –