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:从同一个表和不同表中获取日期时使用其他东西而不是联合
Oracle ebs forms ,我有一段sql,加了where条件在plsql能查出来数据,在form 程序里查不出来。