在SQL查询中使用Not
我有两张表,分别是billcrown和bank_的详细信息。 在billcrown中,每个PJNO都有一个唯一的行:在SQL查询中使用Not,sql,oracle,Sql,Oracle,我有两张表,分别是billcrown和bank_的详细信息。 在billcrown中,每个PJNO都有一个唯一的行: PJNO GRIRNO AMT ---- ------ ---- PJ1 GRIR1 1000 PJ2 GRIR2 150 表bankdetails有 PJNO GRIRNO AMT ---- ------ --- PJ1 GRIR1 100 PJ2 GRIR2 150 PJ1 GRIR1 200 我想显示表billcrown的所有PJNO,其中bank
PJNO GRIRNO AMT
---- ------ ----
PJ1 GRIR1 1000
PJ2 GRIR2 150
表bankdetails有
PJNO GRIRNO AMT
---- ------ ---
PJ1 GRIR1 100
PJ2 GRIR2 150
PJ1 GRIR1 200
我想显示表billcrown的所有PJNO,其中bankdetails中该PJNO的金额总和不等于billcrown中该PJNO的金额
此处,billcrown金额中的PJ1为1000,但PJ1在bankdetails中的金额总和为300。所以它应该被显示出来。但是在PJ2的情况下,billcrown和bankdetails的金额是相同的。也许是这样的
select c.pjno
from billcrowm c join bankdetails d on d.pjno = c.pjno
group by c.pjno
having sum(c.amt) <> sum(d.amt);
[在新信息披露后进行编辑]
与NVL的外部连接可能会完成此任务
select c.pjno
from billcrowm c left join bankdetails d on c.pjno = d.pjno
group by c.pjno
having sum(c.amt) <> nvl(sum(d.amt), 0);
[在阅读了Sharad的评论后,编辑2]
这会奏效的
with BankDetailsCTE
as
(
Select PJNO, sum(AMT) as amt from BankDetails group by PJNO
)
Select d.Pjno from Billcrown d
left join BankDetailsCTE c
on d.pjno = c.pjno
where d.AMT <> c.amt or c.amt is null
如果我理解的很好,你所需要的就是一个带有外部连接的群组 使用以下表格:
create table billcrown (PJNO, GRIRNO, AMT) as (
select 'PJ1', 'GRIR1', 1000 from dual union
select 'PJ2', 'GRIR2', 150 from dual union
select 'PJXX','XXXXX', 100 from dual
);
create table bankdetails (PJNO, GRIRNO, AMT) as (
select 'PJ1', 'GRIR1', 100 from dual union
select 'PJ2', 'GRIR2', 150 from dual union
select 'PJ1', 'GRIR1', 200 from dual
);
这个
给出:
PJNO GRIRNO AMT SUM(BD.AMT)
---- ------ ---------- -----------
PJXX XXXXX 100
PJ1 GRIR1 1000 300
谢谢,但是问题是存在2571行,但是它只显示65行。我检查了同样的结果,发现在BayStices表中没有剩余的PJ。请考虑这个情况,外部连接NVL;我编辑了我的邮件,看一看。谢谢。你真的节省了我的时间。如果Bankdetails表中还有一行的值为PJ1 GRIR1700,那么上面提供的解决方案就不起作用了。你说得对,@Sharad,谢谢。我编辑了我的消息,希望能将其修复。假设在Billcrom表中也有PJ3,是否要显示此值?此解决方案比上面提供的解决方案更有效。
with BankDetailsCTE
as
(
Select PJNO, sum(AMT) as amt from BankDetails group by PJNO
)
Select d.Pjno from Billcrown d
left join BankDetailsCTE c
on d.pjno = c.pjno
where d.AMT <> c.amt or c.amt is null
create table billcrown (PJNO, GRIRNO, AMT) as (
select 'PJ1', 'GRIR1', 1000 from dual union
select 'PJ2', 'GRIR2', 150 from dual union
select 'PJXX','XXXXX', 100 from dual
);
create table bankdetails (PJNO, GRIRNO, AMT) as (
select 'PJ1', 'GRIR1', 100 from dual union
select 'PJ2', 'GRIR2', 150 from dual union
select 'PJ1', 'GRIR1', 200 from dual
);
select bc.PJNO, bc.GRIRNO, bc.AMT, sum(bd.amt)
from billCrown bc
left join bankDetails bd
on (bd.PJNO = bc.PJNO
and bd.GRIRNO = bc.GRIRNO -- do you need this?
)
group by bc.PJNO, bc.GRIRNO, bc.AMT
having sum(nvl(bd.amt, 0)) != bc.amt
PJNO GRIRNO AMT SUM(BD.AMT)
---- ------ ---------- -----------
PJXX XXXXX 100
PJ1 GRIR1 1000 300