来自不同表,条件不同的多个SUM

时间:2019-09-20 20:38:24

标签: mysql sql

我有2个表..一个表名为“ claim”

+----------+----------+--------+------------+
| claim_id | store_id | amount | created_by |
+----------+----------+--------+------------+
|        2 |        2 | 926.00 |          2 |
|        3 |        2 | 746.50 |          5 |
|        4 |        2 | 989.26 |          5 |
|        5 |        2 | 766.00 |          6 |
|        6 |        2 | 403.00 |          6 |
|        7 |        2 | 130.00 |          6 |
+----------+----------+--------+------------+

另一个“索赔进度”

+----------+------+------+---------------------+
| claim_id | type | paid | created             |
+----------+------+------+---------------------+
|        2 | S    |    0 | 2019-09-12 20:37:26 |
|        3 | S    |    0 | 2019-09-12 21:52:32 |
|        4 | S    |    0 | 2019-09-12 22:33:16 |
|        5 | S    |    0 | 2019-09-12 22:53:58 |
|        6 | S    |    0 | 2019-09-12 22:58:55 |
|        7 | S    |    0 | 2019-09-12 23:01:40 |
|        5 | A    |    0 | 2019-09-21 04:02:58 |
|        6 | A    |    0 | 2019-09-21 04:03:02 |
|        5 | PP   |  150 | 2019-09-21 04:03:10 |
|        5 | PP   |   45 | 2019-09-21 04:03:22 |
+----------+------+------+---------------------+

确保它们每个都有更多列,但我将其简化为这样。 Claim_progress是用于跟踪索赔表的付款状态的表,从类型S提交,然后从A批准,然后到PP作为进度付款,最后到P代表已付款。 “ created_by”列是该索赔文件的用户ID。

我在这里想要做的是获得一个班轮,该班轮产生总计2列的金额,而剩余的未偿还款额由“ created_by”提出。到此为止,我需要获取每个标识为“ A”或“ PP”类型的索赔的最新进展。

“ created_by” 6批准的索赔总数应为1169,已支付的总额为195。顺便说一句,这是我到目前为止所得到的信息,但我想知道这是否多余或什至是错误的?

SELECT SUM(c.amount),cp3.paid FROM claim c
JOIN (SELECT claim_id,MAX(created) as maxprogress FROM claim_progress GROUP BY claim_id) cp ON (c.id=cp.claim_id)
JOIN claim_progress cp2 ON (cp.maxprogress=cp2.created)
JOIN (SELECT claim_id,SUM(paid) AS paid FROM claim_progress GROUP BY claim_id) cp3 ON (cp3.claim_id=cp.claim_id)
WHERE cp2.type IN ('A','PP') AND c.created_by='6'

希望这里的数据库管理员可以提供一些启发。谢谢。

编辑:

我希望答案是这样的

+----------------+------+
| total_approved | paid |
+----------------+------+
|           1169 |  195 |
+----------------+------+

1 个答案:

答案 0 :(得分:1)

我觉得我应该可以通过另一个连接来压缩它,但是我只是想不通,现在该关闭电源了。您难以置信在这里接近最佳。这有点简化,但实际上所做的与您之前的相同:

select sum(c.amount) Total_approved, sum(Progress.paid) paid from claim c
join (select claim_id, sum(paid) paid, max(created) created from claim_progress where type = 'A' group by Claim_id, type) Approved on c.claim_id = approved.claim_id
Left join (select claim_id, sum(paid) paid, max(created) created from claim_progress where type = 'PP' group by Claim_id, type) Progress on c.claim_id = progress.claim_id
Where c.created_by = 6

希望这会有所帮助!