【问题标题】:SQL find latest date if mentioned date is not found and extend output如果未找到提到的日期,SQL 查找最新日期并扩展输出
【发布时间】:2022-01-11 11:15:40
【问题描述】:

对于我的示例,我需要执行一个程序,计算所选批次期望日期的余额。

如果输入的日期没有余额它会查找并计算最后一个现有日期的余额

我尝试过这样的事情:

select saldo_do, saldo_br
from
trr_extracts
where batch = 135 and dat_extr = '21.3.2019';

也试过了:

SELECT dat_extr, max(dat_extr)
from trr_extracts
where batch = 135
group by dat_extr;

SELECT IFNULL(dat_extr('21.3.2023'), max(dat_extr)
FROM trr_extracts;

问题是,如何编写只返回一个参数(saldo_do 或 saldo_br)并从给定批次中找到最后日期的语句

解释:

saldo_do 是(正账户余额货币),而 saldo_br 是(负账户余额货币)。该帐户只能有一个。 (货币余额可以是正数或负数)。

如果我运行此代码:

select saldo_do, saldo_br
from
trr_extracts
where batch = 135 and dat_extr = '21.3.2019';

结果是:

此帐户的余额为正数。由于正平衡,它应该只打印saldo_do 而没有saldo_br。像这样。

如果是否定的,那么它应该只打印saldo_br。

现在,我只想打印一个结果。 肯定,如果帐户是肯定的。 Negative 如果帐户为负数。

下一个问题是:

如果在上例中输入的日期 ('21.3.2019') DOES NOT EXIST 对于给定的批次 (135),则语句 应该找到批次 135 的最后日期并使用该日期。

【问题讨论】:

  • minimal reproducible example 在询问 SQL 问题时是一个很好的开始。
  • 您标记了 PLSQL,但使用了 IFNULL。请改用nvl(argument1, argument2)。您可能还需要argument1 的子查询。

标签: sql plsql


【解决方案1】:

您的问题缺少一些信息。表格中的示例数据和预期结果总是有帮助的。 这是我能用给出的信息做的最好的事情。

with data(saldo_do, saldo_br,batch,dat_extr) as (
select 1,2,135,'21.3.2019' a from dual union all
select 1,2,135,'21.5.2019' a from dual union all
select 1,2,135,'21.4.2019' a from dual union all
select 1,2,135,'21.4.2019' a from dual
)
select sum(saldo_do) saldo_do,sum(saldo_br) saldo_br,max(dat_extr) dat_extr from data
where batch = 135 and dat_extr != '21.3.2019' 
group by dat_extr
;

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=82737f99ae14e23d8aa2a66ad6b7e619

【讨论】:

  • 对不起。我已经更新了上面的解释,所以理解起来更清楚。问题相当复杂。查询必须根据账户余额(正数或负数)仅返回一个(saldo_do 或 saldo_br),并且如果输入日期(21.3.2019)不能返回数据,则应使用批次 135 的 LAST DATE。 (对于此示例,请确保批次 135 和日期 21.3.2019 返回某些内容,但如果没有,则查询使用最后日期)。我尝试过 MAX、nullif 等,但无法弄清楚。
【解决方案2】:
with data(saldo_do, saldo_br,batch,dat_extr) as (
select 1,-5,135,'21.3.2019' a from dual union all
select 2,-6,135,'21.5.2019' a from dual union all
select 3,-7,135,'21.4.2019' a from dual union all
select 4,-8,135,'21.4.2019' a from dual
),
maxPbatch as (
select saldo_do, saldo_br,batch,dat_extr
from data where batch = 135 
and dat_extr = 
(select  max(dat_extr) dat_extr 
from data 
where batch = 135 and dat_extr != '21.3.2019'
group by batch )
)
select 
case when d.dat_extr is null then m.saldo_do else d.saldo_do end saldo_do
,case when d.dat_extr is null then m.saldo_br else d.saldo_br end saldo_br
,case when d.dat_extr is null then m.dat_extr else d.dat_extr end dat_extr

from maxPbatch m
left join data d on d.batch = m.batch
and d.dat_extr = '21.3.2019'
;

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=6a1bd0e23c5b1afb4e7a86566aa4d4d6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多