具有多个连接和分组依据的 SQL 嵌套总和

标签 sql oracle

我对 SQL 不是很熟悉。我正在使用甲骨文。我遇到了一个关于字段求和的问题。

以下是示例表:

A:
    A_ID
    A_NAME

B:
    B_ID
    A_ID
    B_NAME
    B_QTY
C:
    C_ID
    B_ID
    C_QTY

所以数据结构就像 A -> *B -> *C

我需要获得按 B_NAME 和 A_ID 分组的 Bs 和 Cs 的总量。例如:
A:
    A_ID    A_NAME
    1       A1
B:
    B_ID    A_ID    B_NAME  B_QTY
    1       1       B1  20
    2       1       B1  5
    3       1       B1  5
    4       1       B2  5
C:
    C_ID    B_ID    C_QTY
    1       1       3
    2       1       4
    4       2       2
    5       2       1
    6       3       1
    7       4       1

预期的结果是:
A_ID    A_NAME  B_NAME  B_QTY   C_QTY
1       A1      B1      30      11
1       A1      B2      5       1

第一行 B_QTY 的 30 是 20 + 5 + 5 的结果。

第一行 C_QTY 的 11 是 3 + 4 + 2 + 1 + 1 的结果。

这是我的sql:
select a.A_ID,
    a.A_NAME,
    b.B_NAME
    sum(b.B_QTY),
    sum(c.C_QTY)
from A a left outer join B b on b.A_ID = a.A_ID
left outer join C c on c.B_ID = b.B_ID
group by a.A_ID
order by a.A_ID, b.B_NAME
    where a.XXXX = XXXXX;

所以问题是:

由于 B 映射到多个 C,因此 B_QTY 将被多次求和。我对 SQL 不是很熟悉,所以我不知道是否有任何简单的方法可以根据某些字段(在我的示例中为 B_ID)来区分求和。谢谢!

最佳答案

这也可以这样做:

WITH b2 AS
(SELECT b.*, sum(b.b_qty) over (partition BY b.a_id, b.b_name) b_qty_s
             FROM b)
SELECT a.a_id, a.a_name, b2.b_name, b2.b_qty_s, sum(c.c_qty) c_qty_s
FROM a JOIN b2 ON a.a_id = b2.a_id
JOIN c ON b2.b_id = c.b_id
GROUP BY a.a_id,a.a_name, b2.b_name, b2.b_qty_s

Here is a sqlfiddle demo

关于具有多个连接和分组依据的 SQL 嵌套总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15870124/

相关文章:

SQL Server linux转发

mysql - 左连接是否可以表示为右连接,反之亦然?

java - 我们可以有多个数据源到单个数据库吗

sql - PLSQL - 提高代码效率

php - 用于在网站上打印交叉引用表的 SQL 查询

sql - SQLite使用自动索引代替我自己的索引

mysql - 一个查询中一个表的 SQL 子组

java - 如何在 hibernate 中渲染具有多个表的树结构?

sql - ORACLE:找不到数据-但是数据存在

java - Oracle 的 Hibernate 方言 19