Oracle 查询继续查找直到值不再为 0
Oracle query to keep looking until value is not 0 anymore
我正在使用 Oracle 11。
我有2张桌子
TblA 列 id,entity_id 和 effective_date。
带有列 id 和值的 TblADetail。
如果生效日期的值 = 0,我想继续寻找下一个生效日期,直到找到值 <> 0 为止。
以下查询仅查找 21 年 3 月 10 日的值。
如果值 = 0,我想查找 21 年 3 月 11 日的值。如果那不是 0,我想停止。
但是,如果那是 0,我想寻找 21 年 3 月 12 日的价值。如果那不是 0,我想停止。
但是,如果那是 0,我想继续寻找直到值不为 0。
我该怎么做?
SELECT SUM(pd.VALUE)
FROM TblA p,TblADetail pd
WHERE p.id = pd.id
AND p.effective_date = to_date('03/10/2021','MM/DD/YYYY')
AND TRIM (p.entity_id) = 123
示例数据:
TblA
id entity_id effective_date
1 123 3/10/21
2 123 3/11/21
3 123 3/12/21
TblADetail
id value
1 -136
1 136
2 2000
3 3000
在上面的数据中,对于 entity_id 123,从 effective_date 3/10/21 开始,我想 return 值 2000(来自 TblADetail)effective_date 3/11/21.
因此,从某个日期开始,我想要具有非零值的最小日期的结果。
谢谢。
直截了当;阅读代码中的注释。第 1 - 13 行中的示例数据,查询从第 14 行开始。
SQL> with
2 -- sample data
3 tbla (id, entity_id, effective_date) as
4 (select 1, 123, date '2021-03-10' from dual union all
5 select 2, 123, date '2021-03-11' from dual union all
6 select 3, 123, date '2021-03-12' from dual
7 ),
8 tblb (id, value) as
9 (select 1, -136 from dual union all
10 select 1, 136 from dual union all
11 select 2, 2000 from dual union all
12 select 3, 3000 from dual
13 ),
14 tblb_temp as
15 -- simple grouping per ID
16 (select id, sum(value) value
17 from tblb
18 group by id
19 )
20 -- return TBLA values whose ID equals TBLB_TEMP's minimum ID
21 -- whose value isn't zero
22 select a.id, a.entity_id, a.effective_date
23 from tbla a
24 where a.id = (select min(b.id)
25 from tblb_temp b
26 where b.value > 0
27 );
ID ENTITY_ID EFFECTIVE_
---------- ---------- ----------
2 123 03/11/2021
SQL>
您可以按照生效日期对总和进行分组,然后使用 MIN
分析函数查找最早日期来完成您需要做的事情。完成后,您只需 select 匹配最早日期的日期。
例如:
with tbla as (select 1 id, ' 123' entity_id, to_date('10/03/2021', 'dd/mm/yyyy') effective_date from dual union all
select 2 id, ' 123' entity_id, to_date('11/03/2021', 'dd/mm/yyyy') effective_date from dual union all
select 3 id, ' 123' entity_id, to_date('12/03/2021', 'dd/mm/yyyy') effective_date from dual),
tbla_detail as (select 1 id, -136 value from dual union all
select 1 id, 136 value from dual union all
select 2 id, 2000 value from dual union all
select 3 id, 3000 value from dual),
results as (select a.effective_date,
sum(ad.value) sum_value,
min(case when sum(ad.value) != 0 then a.effective_date end) over () min_effective_date
from tbla a
inner join tbla_detail ad on a.id = ad.id
where a.effective_date >= to_date('10/03/2021', 'dd/mm/yyyy')
and trim(a.entity_id) = '123'
group by a.effective_date)
select sum_value
from results
where effective_date = min_effective_date;
SUM_VALUE
----------
2000
我正在使用 Oracle 11。 我有2张桌子
TblA 列 id,entity_id 和 effective_date。 带有列 id 和值的 TblADetail。 如果生效日期的值 = 0,我想继续寻找下一个生效日期,直到找到值 <> 0 为止。
以下查询仅查找 21 年 3 月 10 日的值。 如果值 = 0,我想查找 21 年 3 月 11 日的值。如果那不是 0,我想停止。 但是,如果那是 0,我想寻找 21 年 3 月 12 日的价值。如果那不是 0,我想停止。 但是,如果那是 0,我想继续寻找直到值不为 0。 我该怎么做?
SELECT SUM(pd.VALUE)
FROM TblA p,TblADetail pd
WHERE p.id = pd.id
AND p.effective_date = to_date('03/10/2021','MM/DD/YYYY')
AND TRIM (p.entity_id) = 123
示例数据: TblA
id entity_id effective_date
1 123 3/10/21
2 123 3/11/21
3 123 3/12/21
TblADetail
id value
1 -136
1 136
2 2000
3 3000
在上面的数据中,对于 entity_id 123,从 effective_date 3/10/21 开始,我想 return 值 2000(来自 TblADetail)effective_date 3/11/21.
因此,从某个日期开始,我想要具有非零值的最小日期的结果。
谢谢。
直截了当;阅读代码中的注释。第 1 - 13 行中的示例数据,查询从第 14 行开始。
SQL> with
2 -- sample data
3 tbla (id, entity_id, effective_date) as
4 (select 1, 123, date '2021-03-10' from dual union all
5 select 2, 123, date '2021-03-11' from dual union all
6 select 3, 123, date '2021-03-12' from dual
7 ),
8 tblb (id, value) as
9 (select 1, -136 from dual union all
10 select 1, 136 from dual union all
11 select 2, 2000 from dual union all
12 select 3, 3000 from dual
13 ),
14 tblb_temp as
15 -- simple grouping per ID
16 (select id, sum(value) value
17 from tblb
18 group by id
19 )
20 -- return TBLA values whose ID equals TBLB_TEMP's minimum ID
21 -- whose value isn't zero
22 select a.id, a.entity_id, a.effective_date
23 from tbla a
24 where a.id = (select min(b.id)
25 from tblb_temp b
26 where b.value > 0
27 );
ID ENTITY_ID EFFECTIVE_
---------- ---------- ----------
2 123 03/11/2021
SQL>
您可以按照生效日期对总和进行分组,然后使用 MIN
分析函数查找最早日期来完成您需要做的事情。完成后,您只需 select 匹配最早日期的日期。
例如:
with tbla as (select 1 id, ' 123' entity_id, to_date('10/03/2021', 'dd/mm/yyyy') effective_date from dual union all
select 2 id, ' 123' entity_id, to_date('11/03/2021', 'dd/mm/yyyy') effective_date from dual union all
select 3 id, ' 123' entity_id, to_date('12/03/2021', 'dd/mm/yyyy') effective_date from dual),
tbla_detail as (select 1 id, -136 value from dual union all
select 1 id, 136 value from dual union all
select 2 id, 2000 value from dual union all
select 3 id, 3000 value from dual),
results as (select a.effective_date,
sum(ad.value) sum_value,
min(case when sum(ad.value) != 0 then a.effective_date end) over () min_effective_date
from tbla a
inner join tbla_detail ad on a.id = ad.id
where a.effective_date >= to_date('10/03/2021', 'dd/mm/yyyy')
and trim(a.entity_id) = '123'
group by a.effective_date)
select sum_value
from results
where effective_date = min_effective_date;
SUM_VALUE
----------
2000