1

我的桌子设计如下:-


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. 如果表为空,则获取表 A 中存在的所有 subCatId 和 catId,其中 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 和 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它们各自数量的方法。请帮助...谢谢。应用左外连接的原因是,如果 subCatId 在表 B 中不存在,但在表 A 中存在,那么它也应该与结果一起显示。

4

1 回答 1

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。或者,如果树结构不是太深(例如在您的示例中),那么您可以手动遍历一两个级别(如果足够的话)。

于 2012-07-07T21:44:22.380 回答