从同一个表中选择两次,结果在同一行

时间:2014-11-21 16:56:37

标签: mysql join

我想生成一份月度报告,其中显示了从客户端收到的总付款总额以及在单个mySQL查询中发送给供应商的总额,该报告在同一行返回这两个总计。我可以用UNION来做,但是会在不同的行上返回结果。所有付款都在payments表格中,其基本结构为:

id | id_order | id_contact | amount | date_time

更新 contact_id可以是客户或供应商。相关的contacts表有一个字段contact_type,可以是“SUP”或“CLI”。

我希望结果能够总结从客户收到的所有付款并在一段时间内发送给供应商,这样我就可以根据实际付款而不是基于订单销售价格的理论利润产生利润 - 我的成本,特别是因为这些订单是在很长一段时间内分期支付的,所以只要订单在8月支付3000和在12月支付2000,6月份订单的6,000美元就无法获得。

Month      | total $ sent to suppliers | total $ received from clients
June 2014    3000                        5000
July 2014    2500                        3800

我拥有的其他支持表是“订单”表,“联系人”表。有没有办法用连接做到这一点?这是否可行且表现良好,如果没有,我还有其他选择吗? (我正在使用MySQL 5.5,如果重要的话,将在PHP中执行此操作)

2 个答案:

答案 0 :(得分:1)

您将使用条件聚合。您不提供关键信息,例如您如何知道某人是供应商还是客户。以下是查询的外观草图:

select date_format(date_time, '%M %Y') as month,
       sum(case when contact_id = "supplier" then amount else 0 end) as sent,
       sum(case when contact_id = "client" then amount else 0 end) as received
from table t
group by date_format(date_time, '%M %Y')
order by min(date_time);

请注意order by。由于您使用的是非标准日期格式,因此仍将确保行按时间顺序排列。

答案 1 :(得分:0)

这是我提出的解决方案,基于@Gordon Linoff回答

select date_format(p.pay_dcreated, '%M %Y') as month,
sum(case when c.type_con = "FAC" then p.pay_amount else 0 end) as sent,
sum(case when c.type_con = "CST" then p.pay_amount else 0 end) as received
from payments_pay as p, contacts_con as c
where  p.pay_idcon=c.id_con
group by date_format(p.pay_dcreated, '%M %Y')
order by min(p.pay_dcreated);

这给了我想要的结果。