Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何构建SQL查询以显示两列不同日期范围的数据?_Sql_Oracle_Select_Oracle11g - Fatal编程技术网

如何构建SQL查询以显示两列不同日期范围的数据?

如何构建SQL查询以显示两列不同日期范围的数据?,sql,oracle,select,oracle11g,Sql,Oracle,Select,Oracle11g,我正在尝试从Oracle11g数据库构建一个查询,以便在报表中使用。我需要使用两个表CONTACT和CONTACT_EXT从中获取数据,并比较两个日期范围内的联系人总数。这些表通过ID匹配进行连接 联系人: ID | DATE ---------- 1 12/12/2010 2 12/11/2010 3 14/09/2011 联系电话 ID | TYPE ---------- 1 MAIL 2 FAX 3 FAX 例如,如果我将时段A设置为2010年1月1日至2

我正在尝试从Oracle11g数据库构建一个查询,以便在报表中使用。我需要使用两个表CONTACT和CONTACT_EXT从中获取数据,并比较两个日期范围内的联系人总数。这些表通过ID匹配进行连接

联系人:

ID | DATE
----------
1   12/12/2010
2   12/11/2010
3   14/09/2011
联系电话

 ID | TYPE
----------
1   MAIL
2   FAX
3   FAX  
例如,如果我将时段A设置为2010年1月1日至2010年12月12日之间,时段B设置为2011年1月1日至2011年11月11日之间

TYPE | PERIOD A | PERIOD B | TOTAL
MAIL   1          0          1
FAX    1          1          2
问候,, 罗布

问候,, Rob.

只需进行自连接:

select type,period_a,period_b,period_a+period_b as total
from(
  select type,count(1) as period_a
  from contact_ext
  left join contact
  using(id)
  where date>='20100101' and date<='20101212'
  group by 1
)a
join(
  select type,count(1) as period_b
  from contact_ext
  left join contact
  using(id)
  where date>='20110101' and date<='20111111'
  group by 1
)b
using(type);
只需进行自连接:

select type,period_a,period_b,period_a+period_b as total
from(
  select type,count(1) as period_a
  from contact_ext
  left join contact
  using(id)
  where date>='20100101' and date<='20101212'
  group by 1
)a
join(
  select type,count(1) as period_b
  from contact_ext
  left join contact
  using(id)
  where date>='20110101' and date<='20111111'
  group by 1
)b
using(type);

答案1:在where条款中,A期设置在2010年1月1日至2010年12月12日之间,或B期设置在2011年1月1日至2011年11月11日之间 where子句中的用法或条件


Ans 2:您可以合并周期A和周期B的两个不同select语句Ans 1:在where子句中,将周期A设置为2010年1月1日至2010年12月12日之间,或将周期B设置为2011年1月1日至2011年11月11日之间 where子句中的用法或条件


回答2:你可以合并周期A和周期B的两个不同select语句

我已经测试过了,它完全按照我的要求工作,非常感谢!我想指出的是,这个查询所做的工作比需要的要多,因为它必须访问每个表两次。我已经测试过了,它完全按照我想要的方式工作,非常感谢!我想指出,这个查询做的工作比需要的多,因为它必须访问每个表两次。这实际上是正确的答案,由于接受的答案不适用于在时段B中有值但在时段a中没有值的情况,即该行未返回,因此有一个问题是,由于重叠值上的值是“双重计数”的,因此总计是错误的。这实际上是正确的答案,由于接受的答案不适用于我们在时段B中有值但在时段a中没有值的情况,即该行没有返回,因此一个问题是,由于重叠值上的值是“双重计数”的,因此总计是错误的。