结合不同选择的结果

时间:2014-02-01 16:18:30

标签: sql select

我有一个包含字段“ID”,“mailSent”和“serviceUsed”的表。 “mailSent”包含发送邮件的时间,“serviceUsed”包含一个计数器,该计数器只显示用户是否已将该服务用于我发送的特定邮件。

我正在尝试做一个报告,为每个ID提供以下两个事实: 1.用户最后一次使用该服务,即特定用户服务的使用时间!= 0 2.用户使用该服务的总次数,即每个用户的总和(serviceUsed)

我想在一个视图中显示它,并将结果始终映射到特定用户。我可以单独构建两个查询中的每一个,但不知道如何将它组合到一个视图中。这两个查询如下所示:

1. Select ID, max(mailSent) from Mails where serviceUsed > 0 group by ID
2. Select ID, sum(serviceUsed) from Mails group by ID 

请注意,我不能只将它们组合在一起,因为我还想显示从未使用过我的服务的ID,即serviceUsed = 0.因此,如果我只是在第一个查询中删除了where子句,那么我将得到错误的结果max(mailSent)。知道如何将两者结合起来吗?

换句话说,我想要的是这样的: ID,max(mailSent),sum(serviceUsed) 其中max(mailSent)来自第一个查询,sum(serviceUsed)来自第二个查询。

问候!

3 个答案:

答案 0 :(得分:1)

试试这个

SELECT * FROM
(
   Select ID, max(mailSent) from Mails where serviceUsed > 0 group by ID
   UNOIN ALL
   Select ID, sum(serviceUsed) from Mails group by ID 
) AS T

答案 1 :(得分:0)

您可以在一个查询中编写它:

SELECT ID, sum(serviceUsed), max(mailSent) from Mails group by ID;

问题是,您的第二个查询中没有serviceUsed > 0并不重要。你也可以总结它们,因为它们的值为0。

如果您有以下输入:

 id  serviceUsed  mailSent
--------------------------
1        0        1.1.1970
1        4        3.1.1970
1        3        4.1.1970
2        0        2.1.1970

Query应返回此结果:

 id  serviceUsed  mailSent
--------------------------
  1        7      4.1.1970
  2        0      2.1.1970

但我想知道,你的主键在哪里?

答案 2 :(得分:0)

您希望使用条件聚合执行此操作:

select ID, max(case when serviceUsed > 0 then mailSent end),
       sum(serviceUsed)
from Mails
group by ID;