2014-11-21 80 views
0

我要生成客户和总在一个单一的MySQL查询发送给供应商收到了在同一条线上退掉这两总计支付总额的月度报告结果的两倍。我可以用UNION来完成,但是会在不同的行上返回结果。所有款项的payments表的基本结构:选择与在同一行

id | id_order | id_contact | amount | date_time 

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

我想总结所有从客户收到的款项并在一段时间内发送给供应商,这样我就可以根据实际付款产生利润,而不是基于订单销售价格的理论利润 - 我的成本,特别是因为这些订单是在很长一段时间内分期支付的,因此只要订单在八月份支付3000美元而在十二月支付2000美元,那么6月份的订单显示5000美元的利润并不相关。

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

其他支持表,我有“orders”表,“contacts”表。有没有办法与连接做到这一点?这是否可能,并确定性能明智,如果不是我有什么其他选择? (我使用MySQL 5.5将做到这一点在PHP中,如果它的事项)

+0

你试过什么样的sql? – user3791372 2014-11-21 17:02:17

+0

我尝试了一个联盟(从客户端UNION中选择支付来自供应商的支付),但是在结果中返回两行,我想要两列。 SQL不是我的强项:) – lavirius 2014-11-21 17:04:15

+0

什么决定它是否被接收或发送?你能提供一些样本数据吗? – 2014-11-21 17:07:52

回答

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。因为您使用的是非标准日期格式,所以这仍然可以确保行按时间顺序排列。

+0

在“contacts”表中我有一个列contact_type与CLI(ent)或SUP(lier) – lavirius 2014-11-21 17:11:32

+0

@LavaRo。 。 。只需将适当的逻辑插入'when'条件即可。 – 2014-11-21 17:17:45

+0

我认为这个网站是为答案不建议:)对不起,我不知道什么是适当的逻辑:) SQL不是我的强项,但我会更新问题 – lavirius 2014-11-21 17:25:59

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); 

这给了我一个结果,我想要的。