对多列使用连接的累积总和
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】:您可以尝试使用CTE
为JOIN
两个表设置结果集,然后在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
的哪些行。
在您更正数据库模型之前,不可能生成您正在寻找的查询。
【讨论】:
以上是关于对多列使用连接的累积总和的主要内容,如果未能解决你的问题,请参考以下文章