使用汇总值进行进一步计算

时间:2017-12-27 09:14:51

标签: mysql

我有以下查询:

SELECT contracts.id,
  (SELECT sum(pos.sum_to_pay) FROM pos
    where pos.contract_id=contracts.id and pos.is_draft=0) as paid,
  (SELECT sum(acts.amount) FROM acts
    where acts.contract_id=contracts.id) as acts_sum
from contracts

它有效但我想添加另一个应该像to_pay一样计算的结果字段acts_sum - paid = to_pay

我试图这样做:

 SELECT contracts.id,
      (SELECT sum(pos.sum_to_pay) FROM pos
        where pos.contract_id=contracts.id and pos.is_draft=0) as paid,
      (SELECT sum(acts.amount) FROM acts
        where acts.contract_id=contracts.id) as acts_sum,
      (acts_sum - paid) as to_pay 
    from contracts

但我收到错误Unknown column 'acts_sum'。如何根据to_payacts_sum找到paid值?

2 个答案:

答案 0 :(得分:1)

使用像这样的子查询

SELECT acts_sum, paid, (acts_sum - paid) as to_pay FROM
(SELECT contracts.id,
  (SELECT sum(pos.sum_to_pay) FROM pos
    where pos.contract_id=contracts.id and pos.is_draft=0) as paid,
  (SELECT sum(acts.amount) FROM acts
    where acts.contract_id=contracts.id) as acts_sum,
from contracts ) subq

答案 1 :(得分:0)

您可以使用连接重写查询,相关子查询有时被视为昂贵的解决方案

select c.id,
COALESCE(a.acts_sum,0),
COALESCE(p.paid,0),
COALESCE(a.acts_sum,0) - COALESCE(p.paid,0) as to_pay 
from contracts c
left join (
    SELECT contract_id,sum(sum_to_pay) paid
    FROM pos
    where is_draft=0
    group by contract_id
) p on c.id = p.contract_id 
left join (
    SELECT contract_id,sum(amount) acts_sum
    FROM acts
    group by contract_id
) a on c.id = a.contract_id