我有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 |
+----------------+------+
答案 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
希望这会有所帮助!