2014-11-21 83 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); 

這給了我一個結果,我想要的。