【问题标题】:Sum with 3 tables to join与要加入的 3 个表相加
【发布时间】:2020-06-08 04:55:40
【问题描述】:

我有 3 张桌子。第一个和第二个表之间的链接是REQ_ID,第二个和第三个表之间的链接是ENC_ID。第一个和第三个表之间没有直接联系。

INS_RCPT

+----+--------+------+----------+
| ID | REQ_ID | CURR | RCPT_AMT |
+----+--------+------+----------+
|  1 |      1 | USD  |      100 |
|  2 |      2 | USD  |      200 |
|  3 |      3 | USD  |      300 |
+----+--------+------+----------+

ENC_LOG

+----+--------+--------+-------------+
| ID | REQ_ID | ENC_ID | ENC_LOG_AMT |
+----+--------+--------+-------------+
|  1 |      1 |      1 |          20 |
|  2 |      1 |      2 |          50 |
|  3 |      1 |      3 |          30 |
|  4 |      2 |      4 |          20 |
+----+--------+--------+-------------+

ENC_RCPT

+----+--------+--------------+
| ID | ENC_ID | ENC_RCPT_AMT |
+----+--------+--------------+
|  1 |      1 |           10 |
|  2 |      1 |           10 |
|  3 |      2 |           15 |
|  4 |      2 |           25 |
|  5 |      2 |           10 |
|  6 |      3 |           12 |
|  7 |      3 |           18 |
|  8 |      4 |           10 |
+----+--------+--------------+

我希望输出如下:

+----+--------+------+----------+-------------+--------------+
| ID | REQ_ID | CURR | RCPT_AMT | ENC_LOG_AMT | ENC_RCPT_AMT |
+----+--------+------+----------+-------------+--------------+
|  1 |      1 | USD  |      100 |         100 |          100 |
|  2 |      2 | USD  |      200 |          20 |           10 |
|  3 |      3 | USD  |      300 |           0 |            0 |
+----+--------+------+----------+-------------+--------------+

我正在使用 SQL Server 编写此查询。任何帮助表示赞赏。

【问题讨论】:

  • 你在哪里有困难?您是否考虑过使用 JOIN?
  • 这是我们希望看到你的尝试,看看你需要帮助的地方。

标签: sql sql-server join sum


【解决方案1】:

一种方法是将第一个表连接到两个分别计算总和的子查询:

SELECT
    ir.ID,
    ir.REQ_ID,
    ir.CURR,
    ir.RCPT_AMT,
    el.ENC_LOG_AMT,
    er.ENC_RCPT_AMT
FROM INS_RCPT ir
LEFT JOIN
(
    SELECT REQ_ID, SUM(ENC_LOG_AMT) AS ENC_LOG_AMT
    FROM ENC_LOG
    GROUP BY REQ_ID
) el
    ON ir.REQ_ID = el.REQ_ID
LEFT JOIN
(
    SELECT t1.REQ_ID, SUM(t2.ENC_RCPT_AMT) AS ENC_RCPT_AMT
    FROM ENC_LOG t1
    INNER JOIN ENC_RCPT t2 ON t1.ENC_ID = t2.ENC_ID
    GROUP BY t1.REQ_ID
) er
    ON ir.REQ_ID = er.REQ_ID

Demo

请注意,您的问题包括一个曲线球。第二个子查询需要通过REQ_ID 返回收据表的聚合,即使该字段未出现在该表中。结果,我们实际上需要在那个子查询中加入ENC_LOGENC_RCPT,然后通过REQ_ID聚合。

【讨论】:

    【解决方案2】:

    您可以尝试以下查询。还可以根据您的要求将连接从左更改为内。

    select a.id,a.req_id,a.curr,sum(a.rcpt_amt) rcpt_amt,sum(a.enc_log_amt) enc_log_amt,sum(c.enc_rcpt_amt) enc_rcpt_amt
    from
    (
    select a.id id ,a.req_id req_id ,a.curr curr,sum(rcpt_amt) as rcpt_amt,sum(enc_log_amt) as enc_log_amt
    from ins_rcpt a
    left join enc_log b
    on a.req_id=b.req_id
    group by id,req_id,curr
    ) a
    left join enc_rcpt c 
    on a.enc_id = c.enc_id
    group by id,req_id,curr;
    

    【讨论】:

    • 非常感谢蒂姆。由于曲线球,我无法找到解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2011-07-20
    • 2013-08-25
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多