【问题标题】:Getting data from different tables between dates when each table has it on date modified在每个表修改日期的日期之间从不同表中获取数据
【发布时间】:2018-08-20 14:56:54
【问题描述】:

想就我目前正在努力解决的一种情况从大家那里获得一些意见。下面是一个问题陈述

我有表 A、B、C

A 有下面的列 用户|修改日期| wokred_on A | ..一些与用户操作相关的更多内容

B 有列 用户 |修改日期 |工作于 B | ..其他一些列

C 有列 用户 |修改日期 |从事过 C| ..其他一些列

这些表除了用户之外没有任何直接关系。

我们必须从这些表中提取用户在给定日期之间的数据,以及他在给定日期范围内所做的计数操作或工作吗?

我在这里的挣扎是,如果选择的日期范围不在其他列中,那么每个表都有自己的日期修改,但我仍然需要提取数据,因为用户在日期之间对其进行了处理。

是否可以选择这些日期并将其放在一列中,以便可以将其放在 where 子句中并通过外部连接来提取其他记录?

对于这个大问题陈述感到抱歉。任何建议都非常感谢

下面是一个用例。只是扩展 littlefoot 给出的假设

首先,测试用例:

SQL> create table a (cuser varchar2(10), modified_date date,action );

varchar2 (10) ) 表已创建。

SQL> create table b (
Table created.cuser varchar2(10), modified_date date,action 

varchar2 (10) );

SQL> create table c (cuser varchar2(10), modified_date date,action 

varchar2 (10) ));

Table created.

SQL> insert into a values ('lf', date '2018-05-01', 'issue raised');

1 row created.

SQL> insert into a values ('mc', date '2018-05-01', 'issue raised ');

1 row created.

SQL> insert into b values ('lf', date '2018-05-01',issue raised');

1 row created.

SQL> insert into b values ('lf', date '2018-05-01','issue resolved');

1 row created.

SQL> insert into c values ('if', date '2018-05-28',' issue resolved');

1 row created.

SQL> insert into c values ('mc', date '2018-05-13','issue raised');

1 row created.

SQL> insert into c values ('mc', date '2018-05-13','issue resolved');

1 row created.

SQL> alter session set nls_date_format = 'yyyy-mm-dd';

Session altered.

SQL> select * from a;

CUSER      MODIFIED_D. ACTION 
---------- ----------
lf         2018-05-01     issue raised
mc         2018-05-01    issue raised

SQL> select * from b;

CUSER      MODIFIED_D    ACTION
---------- ----------.         ______________
lf         2018-05-01    issue raised
lf         2018-05-01.  issue resolve 

SQL> select * from c;

CUSER      MODIFIED_D. ACTION
---------- ----------
If         2018-05-28.      issue resolve
mc         2018-05-13.    issue raised
mc         2018-05-13.    issue resolve

CUSER    DATE             CNT_ISSUE_RAISED   CNT_ISSUE_RESOLVED 

-------- ------- ---------------- -------------------
如果 2018-05-01 2 1
lf 2018-05-28 0 1
mc 2018-05-01 0 1
MC 2018-05-13 1 1

【问题讨论】:

  • 你能给出示例数据和你希望达到的结果吗?

标签: oracle join


【解决方案1】:

这就是我对问题的理解。

首先,测试用例:

SQL> create table a (cuser varchar2(10), modified_date date);

Table created.

SQL> create table b (cuser varchar2(10), modified_date date);

Table created.

SQL> create table c (cuser varchar2(10), modified_date date);

Table created.

SQL> insert into a values ('lf', date '2018-05-01');

1 row created.

SQL> insert into a values ('mc', date '2018-05-15');

1 row created.

SQL> insert into b values ('lf', date '2018-05-07');

1 row created.

SQL> insert into b values ('lf', date '2018-05-08');

1 row created.

SQL> insert into c values ('jw', date '2018-05-28');

1 row created.

SQL> insert into c values ('mc', date '2018-05-13');

1 row created.

SQL> insert into c values ('mc', date '2018-05-22');

1 row created.

SQL> alter session set nls_date_format = 'yyyy-mm-dd';

Session altered.

SQL> select * from a;

CUSER      MODIFIED_D
---------- ----------
lf         2018-05-01
mc         2018-05-15

SQL> select * from b;

CUSER      MODIFIED_D
---------- ----------
lf         2018-05-07
lf         2018-05-08

SQL> select * from c;

CUSER      MODIFIED_D
---------- ----------
jw         2018-05-28
mc         2018-05-13
mc         2018-05-22

返回所需结果的查询 - 每个表中每个用户在所需日期期间的行数。当我使用 SQL*Plus 时,变量前面有 && 以避免多个插入请求。在您使用的工具中,这可能是一个冒号 (:)。

SQL> select nvl(nvl(a.cuser, b.cuser), c.cuser) cuser,
  2         count(distinct a.modified_date) cnt_a,
  3         count(distinct b.modified_date) cnt_b,
  4         count(distinct c.modified_date) cnt_c
  5  from a full outer join b on a.cuser = b.cuser
  6         full outer join c on a.cuser = c.cuser
  7  where a.modified_date between &&date_from and &&date_to
  8     or b.modified_date between &&date_from and &&date_to
  9     or c.modified_date between &&date_from and &&date_to
 10  group by nvl(nvl(a.cuser, b.cuser), c.cuser)
 11  order by 1;
Enter value for date_from: '2018-05-01'
Enter value for date_to: '2018-06-01'

CUSER           CNT_A      CNT_B      CNT_C
---------- ---------- ---------- ----------
jw                  0          0          1
lf                  1          2          0
mc                  1          0          2

SQL>

【讨论】:

  • 感谢您的回答小脚。我更新了我所期望的假设。您的假设非常接近这里需要的是每个用户执行的操作的日期和计数。希望这有帮助。对不起,我唯一的描述性问题。
  • 不客气。嗯,我刚刚拒绝了“某人的”编辑——它似乎是你的。无论如何:如果您设法获得解决方案,您也可以将其发布为“答案”。或者,编辑问题并提供新信息。
猜你喜欢
  • 1970-01-01
  • 2010-10-05
  • 2013-10-19
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 2017-06-12
相关资源
最近更新 更多