使用连接多于一列的累积总和

时间:2018-10-01 20:26:37

标签: sql oracle group-by

我有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)中更改

2 个答案:

答案 0 :(得分:1)

不,它无法完成。

您的数据库模型不完整。您假设表的行具有固有顺序:它们没有固有的顺序。 Oracle可以随时随时对表中的行进行重新排序。

因此,您不能假设行(null,'interest')是表的“第二行”,并且它紧接在“第一行”之后—没什么。简单来说,数据库表不是Excel工作表。

您需要在表之间创建某种关系(外键),以记录cat_desc中的哪些行属于cat_test中的哪些行。

在您更正数据库模型之前,无法生成您要查找的查询。

答案 1 :(得分:1)

您可以尝试使用CTE为两个表JOIN设置结果集,然后使用JOINconcat ... 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 |