选择与在同一行
问题描述:
我要生成客户和总在一个单一的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中,如果它的事项)
答
你会使用条件聚集。您不提供关键信息,例如您如何知道某人是供应商还是客户。以下是查询会是什么样草图:
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
。因为您使用的是非标准日期格式,所以这仍然可以确保行按时间顺序排列。
答
这是我想出了基于@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);
这给了我一个结果,我想要的。
你试过什么样的sql? – user3791372 2014-11-21 17:02:17
我尝试了一个联盟(从客户端UNION中选择支付来自供应商的支付),但是在结果中返回两行,我想要两列。 SQL不是我的强项:) – lavirius 2014-11-21 17:04:15
什么决定它是否被接收或发送?你能提供一些样本数据吗? – 2014-11-21 17:07:52