【问题标题】:Oracle query to keep looking until value is not 0 anymoreOracle 查询继续查找直到值不再为 0
【发布时间】:2021-11-08 23:09:01
【问题描述】:

我正在使用 Oracle 11。 我有 2 张桌子

具有列 id、entity_id 和 Effective_date 的 TblA。 带有列 id 和 value 的 TblADetail。 如果生效日期的 Value = 0,我想继续寻找下一个生效日期,直到找到 value 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 开始,我想返回值 2000(来自 TblADetail) Effective_date 3/11/21。

所以,从某个日期开始,我想要从具有非零值的最小日期开始的结果。

谢谢。

【问题讨论】:

  • 样本数据和预期输出在这里会非常有帮助。例如,您要连接两个表并执行sum,因此大概可以返回多行。你需要两张桌子吗?或者你能用 1 证明问题并简化查询吗?如果要求和的 n 行中有 1 行的 value 为 0,该怎么办?如果单个 value 行都不为 0,但 sum 为 0,该怎么办?
  • 您是说您想要具有非零值的最小日期的结果,其中日期至少是特定日期?
  • 我确实需要 2 个表,因为生效日期来自 TblA,而 Value 来自 TblADetail。单个值行可以为 0,但我正在寻找总和为 0 的时间。我在原始帖子中添加了一个示例。是的,从某个日期开始,我想要具有非零值的最小日期的结果

标签: oracle oracle11g


【解决方案1】:

您可以通过对生效日期的总和进行分组,并使用MIN 分析函数查找最早日期来完成您需要做的事情。完成后,您只需选择与最早日期匹配的日期。

例如:

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

【讨论】:

    【解决方案2】:

    直截了当;在代码中读取 cmets。第 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>
    

    【讨论】:

    • 嗨,它需要最小有效日期(在某个日期之后)的总和(值),而不是最小 id。因此,在我上面的示例中,我需要最接近 21 年 3 月 10 日的日期不为 0 的总和(值)。在这种情况下 3/11/21 sum(value) 不是 0
    • 谢谢 Boneist。您的查询有效,但是如果所有值都是 0 呢?在这种情况下,您的查询不会返回任何内容。当所有值都为 0 时,它如何返回 0 ?谢谢
    猜你喜欢
    • 2011-10-28
    • 2015-07-24
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多