对多列使用连接的累积总和

Posted

技术标签:

【中文标题】对多列使用连接的累积总和【英文标题】:cumulative sum using join for more than one column 【发布时间】:2018-10-01 20:26:36 【问题描述】:

我有 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 query 连接 2 个表,如下所示

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) 中的数据顺序不应该改变

【问题讨论】:

【参考方案1】:

您可以尝试使用CTEJOIN 两个表设置结果集,然后在select 中使用concat ... like 的子查询JOIN 来获得总数。然后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 |

【讨论】:

我不认为这是正确的。表之间缺少关系,这会阻止“空”行之间的链接。【参考方案2】:

不,不能这样做。

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

因此,您不能假设行 (null,'interest') 是表的“第二行”,并且它紧随“第一行”之后——没有这样的事情。用简单的英语来说,数据库表不是 Excel 工作表。

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

在您更正数据库模型之前,不可能生成您正在寻找的查询。

【讨论】:

以上是关于对多列使用连接的累积总和的主要内容,如果未能解决你的问题,请参考以下文章

使用右表上的总和分组对多列进行 SQL 连接

如何创建按列分组的累积总和

对数据框进行子集化并对多列应用累积操作

在 Pyspark 中对多列进行累积求和的有效方法

pyspark中基于条件对多列进行分组的累积和函数

最近 n_days 使用 groupby 在特定列上的累积总和