我的表格有以下设计: -
Table A
--------------------------
subCatId | catId | catDesc
--------------------------
1 | 3 | 100
2 | 3 | 100
3 | 5 | 100
4 | 5 | 100
5 | | 100
Table B
--------------------------
subCatId | amount
--------------------------
1 | 10
2 | 20
3 | 5
4 | 15
5 |
第三个表,即表AB,是要插入记录的表。在上面的表格的基础上,查询应该: 1.检查表AB,是否存在任何subCatId。 2.如果表格为空,则获取所有subCatId& catId出现在表A中,其中catDesc = 100并且基于表A的subCatId获取表B的数量。
Table AB
--------------------------
subCatId | catId | amount
--------------------------
1 | 3 | 10
2 | 3 | 20
3 | 5 | 35
4 | 5 | 15
5 | | 50
正如您在上面的表AB中看到的subCatId 1& 2 catId为3,因此1&的金额值为1。 2应该总结并显示subCatId 3(包括表B中已经存在的金额值5)。类似地,对于subCatId 5,金额值应该从subCatId 3& 4。
如果有人能帮助我获得如上所示TableAB的预期结果,我将非常感激。
我已经单独尝试了以下查询
SELECT A.CATID, SUM(B.AMOUNT)
FROM A LEFT OUTER JOIN B
ON A.SUBCATID = B.SUBCATID
WHERE A.CATDESC=100
AND A.SUBCATID NOT IN
(SELECT AB.SUBCATID FROM AB)
GROUP BY CATID;
但是,它只提供catid和总金额值,但我找不到获得subCatId
及其各自金额的方法。请帮忙......谢谢。应用左外连接的原因是,如果表B中不存在subCatId,但它存在于表A中,那么它也应该与结果一起显示。
答案 0 :(得分:1)
这种解释很接近,但并不能得到你想要的东西。
首先,从金额的基表开始:
select a.subcatid, a.catid, b.amount
from (select *
from A
where a.catdesc = 100
) A left outer join
B
on a.subcatid = b.subcatid left outer join
AB
on a.subcatid = ab.subcatid and a.catid = b.catid
where ab.subcatid is null
接下来,您希望在此处获取金额并添加catid等于subcat id的所有金额。要做到这一点,我们需要一个自我加入。我将使用with语法将其定义为别名:
with t as (
select a.subcatid, a.catid, b.amount
from (select *
from A
where a.catdesc = 100
) A left outer join
B
on a.subcatid = b.subcatid left outer join
AB
on a.subcatid = ab.subcatid and a.catid = b.catid
where ab.subcatid is null
)
select t.subcatid, t.catid,
(t.amount + coalesce(tcat.amount, 0)) as amount
from t left outer join
(select catid, sum(amount) as amount
from t
group by catid
) tcat
on t.subcatid = t.cat
问题在于,它总计了基本金额,但不计算中间总计。因此,“5”的总数包括“3”和“4”的基数,但不包括它们下面的小计。
要获得完整的解决方案,您似乎需要两件事之一。构建一个循环以逐行遍历表,使用更新和查询来获取所需内容。或者,我认为Oracle具有“connect by”语句,该语句允许沿树结构进行查询。不幸的是,我不太清楚它产生正确的SQL。或者,如果树结构不太深 - 例如在您的示例中 - 那么您可以手动遍历一个或两个级别,如果这足够的话。