我有2个表cat_test和cat_desc
create table cat_test(id varchar2(5),day1_balance number,day2_balance number)
insert into cat_test values(5001,1,34);
insert into cat_test values(5002,1821,34344);
insert into cat_test values(5003,1,34);
insert into cat_test values(5004,1221,3444);
create table cat_desc(cat varchar2(5),descr varchar2(20))
insert into cat_desc values(5001,'interest1');
insert into cat_desc values(null,'interest');
insert into cat_desc values(5002,'expense1');
insert into cat_desc values(5003,'expense2');
insert into cat_desc values(null,'expense');
insert into cat_desc values(5004,'sales');
select * from cat_test
ID DAY1_BALANCE DAY2_BALANCE
----- ------------ ------------
5001 1 34
5002 1821 34344
5003 1 34
5004 1221 3444
select * from cat_desc
CAT DESCR
----- --------------------
5001 interest1
interest
5002 expense1
5003 expense2
expense
5004 sales
我希望输出为
CAT DAY1_BALANCE DAY2_BALANCE
----- ------------ -------------
5001 1 34
1 34
5002 1821 34344
5003 1 34
1822 34378
5004 1221 3444
但是,我可以通过查询将两个表连接如下
with qur
as
(select a.cat mycat,
(select day1_balance from cat_test b
where a.cat=b.id) myday1,
(select day2_balance from cat_test b
where a.cat=b.id) myday2
from cat_desc a)
select * from qur
MYCAT MYDAY1 MYDAY2
----- ---------- ----------
5001 1 34
5002 1821 34344
5003 1 34
5004 1221 3444
6 rows selected.
我想在cat列为空的地方添加累计余额,请帮助我进一步进行此操作
另外,以任何其他方式帮助连接该表。我希望数据顺序不应该在table2(cat_desc)中更改
答案 0 :(得分:1)
不,它无法完成。
您的数据库模型不完整。您假设表的行具有固有顺序:它们没有固有的顺序。 Oracle可以随时随时对表中的行进行重新排序。
因此,您不能假设行(null,'interest'
)是表的“第二行”,并且它紧接在“第一行”之后—没什么。简单来说,数据库表不是Excel工作表。
您需要在表之间创建某种关系(外键),以记录cat_desc
中的哪些行属于cat_test
中的哪些行。
在您更正数据库模型之前,无法生成您要查找的查询。
答案 1 :(得分:1)
您可以尝试使用CTE
为两个表JOIN
设置结果集,然后使用JOIN
中concat ... like
的子查询select
来获得总计。然后UNION ALL
create table cat_test(id varchar2(5),day1_balance number,day2_balance number);
insert into cat_test values(5001,1,34);
insert into cat_test values(5002,1821,34344);
insert into cat_test values(5003,1,34);
insert into cat_test values(5004,1221,3444);
create table cat_desc(cat varchar2(5),descr varchar2(20));
insert into cat_desc values(5001,'interest1');
insert into cat_desc values(null,'interest');
insert into cat_desc values(5002,'expense1');
insert into cat_desc values(5003,'expense2');
insert into cat_desc values(null,'expense');
insert into cat_desc values(5004,'sales');
查询1 :
WITH CTE AS (
SELECT *
FROM cat_test ct RIGHT JOIN cat_desc cd
ON ct.id = cd.cat
)
SELECT CAT,day1_balance, day2_balance FROM
(
SELECT DESCR,day1_balance, day2_balance,cat
FROM CTE
WHERE cat is not null
UNION ALL
SELECT DESCR,(SELECT SUM(day1_balance)
FROM CTE t2
WHERE t2.DESCR like ('%' || t1.DESCR || '%'))
,(SELECT SUM(day2_balance)
FROM CTE t2
WHERE t2.DESCR like ('%' || t1.DESCR || '%')),
cat
FROM CTE t1
where cat is null
) t1
ORDER BY DESCR desc
Results :
| CAT | DAY1_BALANCE | DAY2_BALANCE |
|--------|--------------|--------------|
| 5004 | 1221 | 3444 |
| 5001 | 1 | 34 |
| (null) | 1 | 34 |
| 5003 | 1 | 34 |
| 5002 | 1821 | 34344 |
| (null) | 1822 | 34378 |