2012-12-10 78 views
1

我需要拿出一份報告,看起來是這樣的:我需要幫助創建一個SQL查詢

enter image description here

有3代表代理,銷售和支付。銷售和付款通過代理錶鏈接。該報告將顯示每位代理人每天的每日總銷售額。它還需要顯示代理商每天支付的任何款項,這些款項將從總銷售餘額中扣除,以便我們可以知道代理商是否欠款,反之亦然。

我的計劃來解決這個問題的方法是:

  • 獲取每個代理每天所有銷售(一個查詢)
  • 獲取每人每天代理的所有款項(一個查詢)
  • 每個銷售,代理人和每天檢查(代理商每天每位代理商的付款)(循環)
  • 如果找到匹配項,可以用累計總計得到價值和用於計算
  • 否則,只顯示適當的銷售數據僅與累計總數。

我不確定是否有查詢可以讓我的生活變得更輕鬆。謝謝。

[編輯]

代理表: ID, 名, opening_balance

銷售表: ID, AGENT_ID, 量, CUSTOMER_ID, SALE_DATE

付款表: ID, AGENT_ID, 量, bank_id, PAYMENT_DATE, 狀態

[第二編輯]

由於奧拉夫Dietsche。沒有子選擇的第二個查詢需要很長時間才能運行。約88秒。我也嘗試了第一次使用子選擇,並且它在閃存中完成,但是sum(s.amount)和sum(p.amount)保持值應該是它們的兩倍。

enter image description here

[第三屆編輯]

代理可以使多個銷售和 代理可以進行多次支付

有銷售和支付

+3

這些都是通過「代理」連接的,如果您提供表格詳細信息(列名稱),我可以幫助您編寫單個查詢以加入這些查詢。 – NappingRabbit

+3

請張貼表格的結構。你需要的是具有聚合函數的「JOIN」和「GROUP BY」,那麼這將是累計總數的問題。 –

+0

你可以發佈有關代理表的更多詳細信息嗎? – DrinkJavaCodeJava

回答

0

這裏有一個之間沒有直接連接第一次切割

select a.name, s.sale_date, sum(s.amount), sum(p.amount), 
     (select sum(amount) 
     from sales 
     where agent_id = a.id and sale_date <= s.sale_date) as cum_sales, 
     (select sum(amount) 
     from payments 
     where agent_id = a.id and payment_date <= s.sale_date) as cum_payments 
from agents a 
join sales s on s.agent_id = a.id 
join payments p on p.agent_id = a.id 
group by s.agent_id, s.sale_date 
order by s.agent_id, s.sale_date 

累計餘額爲opening_balance - cum_sales + cum_payments

SQL Fiddle

這裏是沒有一個子查詢選擇。這可能更快

select a.name, s.sale_date, sum(s.amount), sum(p.amount), 
     sum(cs.amount) as cum_sales, 
     sum(cp.amount) as cum_payments 
from agents a 
join sales s on s.agent_id = a.id 
join payments p on p.agent_id = a.id 
join sales cs on cs.agent_id = a.id and cs.sale_date <= s.sale_date 
join payments cp on cp.agent_id = a.id and cp.payment_date <= s.sale_date 
group by s.agent_id, s.sale_date 
order by s.agent_id, s.sale_date 

SQL Fiddle

兩者都是未經檢驗的,因爲我沒有數據來這樣做。