PLSQL 同一表中不同日期的相同数据

Posted

技术标签:

【中文标题】PLSQL 同一表中不同日期的相同数据【英文标题】:PLSQL same data with different dates from same table 【发布时间】:2020-06-15 10:34:37 【问题描述】:

我在 Oracle 中有一个表,我想获取 sysdate 的借方和贷方列总和的差异以及 6 个月前的借方和贷方列总和的相同差异

我的查询是

select a.name,a.id, nvl(sum(a.debit),0)-nvl(sum(a.credit),0) current_bal
from mytable a
where a.id='1092' and a.docdate<=sysdate
group by a.name,a.id
union
select b.name,b.id,nvl(sum(b.debit),0)-nvl(sum(b.credit),0) current_bal1
from mytable b
where b. id='1092' and b.docdate<=add_months(sysdate,-6)
group by b.name,b.id;

我得到了正确的结果,但查询返回了两行,而我需要将此结果显示为单行。

请在我的查询中提出任何建议/更正。

【问题讨论】:

在一行中 - 你想以逗号分隔的方式显示它们吗? 不,我得到两行,如第一行:id-1 name-1 120000 和第二行 id-1 name-1 250000,我希望它们像 id-1 name- 1 120000 250000 【参考方案1】:

您可以按如下方式使用条件聚合:

select a.name,a.id, nvl(sum(CASE WHEN a.docdate<=sysdate THEN a.debit END),0)-nvl(sum(CASE WHEN a.docdate<=sysdate THEN a.credit END),0) current_bal,
nvl(sum(CASE WHEN b.docdate<=add_months(sysdate,-6) THEN a.debit END),0)-nvl(sum(CASE WHEN b.docdate<=add_months(sysdate,-6) THEN a.credit END),0) current_bal1
from mytable a
where a.id='1092'
group by a.name,a.id;

--更新

如果您遇到任何问题,那么最简单的方法是在子查询之间使用自联接,如下所示:

SELECT A.NAME, A.ID, A.CURRENT_BAL, B.CURRENT_BAL1
FROM
(select a.name,a.id, nvl(sum(a.debit),0)-nvl(sum(a.credit),0) current_bal
from mytable a
where a.id='1092' and a.docdate<=sysdate
group by a.name,a.id) A
JOIN 
(select b.name,b.id,nvl(sum(b.debit),0)-nvl(sum(b.credit),0) current_bal1
from mytable b
where b. id='1092' and b.docdate<=add_months(sysdate,-6)
group by b.name,b.id) B
ON A.ID = B.ID AND A.NAME = B.NAME;

【讨论】:

它返回单行但空列 哪些列是空的?最后两个? 所有结果列,我的意思是空结果,没有数据 实际上我的查询是正确的,但我得到了两行,如第一行:id-1 name-1 120000 和第二行 id-1 name-1 250000,我希望它们像 id 一样在一行中-1 名称-1 120000 250000 它对 Tejash 有效。干得好。谢谢。更新部分解决了我的问题。这意味着我需要一个连接查询。【参考方案2】:

您可以使用条件聚合:

select a.name, a.id, 
       coalesce(sum(a.debit), 0) - coalesce(sum(a.credit), 0) as current_bal,
       (sum(case when a.docdate < add_months(sysdate, -6) then a.debit else 0 end) -
        sum(case when a.docdate < add_months(sysdate, -6) then a.credit else 0 end)
       ) as bal_6_months
from mytable a
where a.id = '1092' and a.docdate <= sysdate
group by a.name, a.id;

这会将两个值放在同一行中。这对我来说似乎比将它们放在不同的行中更有用。

【讨论】:

它返回单行但空列【参考方案3】:

你可以试试:

select a.name,a.id, LISTAGG(nvl(sum(a.debit),0)-nvl(sum(a.credit),0), ' ') WITHIN GROUP (ORDER BY a.id) current_bal
from mytable a
where a.id='1092' and a.docdate<=sysdate
group by a.name,a.id
union
select b.name,b.id, LISTAGG(nvl(sum(a.debit),0)-nvl(sum(a.credit),0), ' ') WITHIN GROUP (ORDER BY a.id) current_bal
from mytable b
where b. id='1092' and b.docdate<=add_months(sysdate,-6)
group by b.name,b.id;

【讨论】:

以上是关于PLSQL 同一表中不同日期的相同数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:从同一个表和不同表中获取日期时使用其他东西而不是联合

在同一列中不存在某些 ID 的大表中选择数据。加快查询

比较两个列并从同一个表中的另一列获取数据

我可以将不同文件格式的数据保存在同一个配置单元表中吗?

Oracle ebs forms ,我有一段sql,加了where条件在plsql能查出来数据,在form 程序里查不出来。

循环遍历多个表的 plsql 代码