2011-12-29 17 views
0

我有一個叫ORDEREXECUTIONS表,用於存儲已執行的所有訂單。這是一個多貨幣應用程序,因此該表有兩列CURRENCY1_ID和CURRENCY2_ID。合併2個選擇到一個SELECT在我的Rails應用程序

要獲得所有訂單的列表特定貨幣對(如EUR/USD)我需要線獲得總計:

v = Orderexecution.where("is_master=1 and currency1_id=? and currency2_id=? and created_at>=?",c1,c2,Time.now()-24.hours).sum("quantity").to_d 
v+= Orderexecution.where("is_master=1 and currency1_id=? and currency2_id=? and created_at>=?",c2,c1,Time.now()-24.hours).sum("unitprice*quantity").to_d 

注意,我的SUM()公式取決於不同貨幣的順序。 例如如果我想總訂購的貨幣對美元則它執行的數量(對美元匯率假設ID爲1和歐元爲2

v = Orderexecution.where("is_master=1 and currency1_id=? and currency2_id=? and created_at>=?",1,2,Time.now()-24.hours).sum("quantity").to_d 
v+= Orderexecution.where("is_master=1 and currency1_id=? and currency2_id=? and created_at>=?",2,1,Time.now()-24.hours).sum("unitprice*quantity").to_d 

如何寫這篇文章的回報率,使其只觸發一個單獨的SQL聲明到MySQL

+0

在2個查詢條件中,c1,c2的順序是否有意不同? – 2012-01-06 09:35:10

+0

是的,這是故意的。我不會將數據存儲在數據庫中。 currency1_id始終是買入貨幣,currency2_id是賣出貨幣。我在一張桌子上購買和銷售。 – KKK 2012-01-06 09:39:07

回答

1

我想這會做?

v = Orderexecution.where("is_master=1 
          and ((currency1_id, currency2_id) = (?,?) 
           or (currency1_id, currency2_id) = (?,?) 
           ) 
          and created_at>=?" 
         ,c1, c2, c2, c1, Time.now()-24.hours 
         ) 
        .sum("CASE WHEN currency1_id=? 
           THEN quantity 
          ELSE unitprice*quantity 
         END" 
         ,c1 
        ) 
        .to_d 
+0

完美的作品。謝謝。只是一個小故障,我不得不將其更改爲 V = Orderexecution.where(「is_master = 1,((currency1_id,currency2_id)=(?,?) 或(currency1_id,currency2_id)=(?,?))和created_at > =?」,C1,C2,C2,C1,Time.now() - 24.hours)的.sum( 「CASE WHEN currency1_id =#{C1} THEN ELSE數量單價*量END」)to_d 我不相當知道爲什麼我必須改變SUM部分使用=#{c1}而不是=?但它不斷給我一個錯誤。 – KKK 2012-01-06 13:54:02

+0

真的不知道,我的Ruby技能非常有限。試圖將SQL翻譯成它。說實話,在這種情況下,2個查詢似乎比1好。而且他們可能會更快。 – 2012-01-06 19:13:07

+0

或者像SELECT(SELECT ... query1)+(SELECT ... query2)這樣的東西。但是我不知道如何在RoR中編寫代碼(或者甚至可能)。 – 2012-01-06 19:14:31

0

所以,你可以做

SELECT SUM(IF(currency1_id = 1 and currency2_id = 2, quantity,0)) as quantity, 
    SUM(IF(currency2_id = 1 and currency1_id = 2, unitprice * quantity,0)) as unitprice _quantity from order_expressions 
WHERE created_at > ? and (currency1_id = 1 or currency1_id = 2) 

如果你把它插入到find_by_sql你應該得到一個對象回來了,帶着兩個屬性,quantityunitprice_quantity(他們不會在檢查的控制檯,但他們應該在那裏的輸出顯示出來,如果你檢查的屬性散列或致電存取方法直接)

但根據您的指標可能實際上是慢,因爲它可能無法作爲有效地使用索引。 currency1_id似乎是多餘的條件意味着這將能夠使用[currency1_id, created_at]上的索引。做基準之前和之後 - 有時候2個快速查詢比一個慢點更好!

相關問題