2011-12-29 4 views
0

実行されたすべての注文を格納するORDEREXECUTIONSというテーブルがあります。それは多通貨アプリケーションなので、テーブルにはCURRENCY1_IDとCURRENCY2_IDという2つの列があります。特定の通貨ペアのすべての注文(例えばEUR/USD)のリストを取得するには2つのSELECTをRAILSアプリケーションの1つのSELECTに結合します。

私は合計を取得する行する必要があります:私のSUM()式がに応じて異なることを

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 

注意通貨の順序。例: 私がしたい場合は、合計が、それはその後、実行通貨ペアUSDの量を命じた(USDのための仮定通貨IDは1であり、それはただ1つのSQLをトリガーするように、EUR、私はRoRのでこれを書くかどう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 

ですMySQLへの声明私はこれはどうなると思います

+0

条件内のc1、c2の順序が2つのクエリで異なることは意図的ですか? –

+0

はい、それは意図的です。私はデータがDBに格納される方法です。 currency1_idは常に購入通貨、currency2_idは売り通貨です。私は買物を売り、一つのテーブルに売る。 – KKK

答えて

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

完璧に動作します。ありがとう。ちょうど1つのグリッチ、私は にそれを変更しなければならなかったv = Orderexecution.where( "is_master = 1 and(currency1_id、currency2_id)=(?、?) または(currency1_id、currency2_id)=(?、?))and created_at > =? "、c1、c2、c2、c1、Time.now() - 24.hours).sum("通貨1_id =#{c1} THEN数量ELSE単価*数量END ")to_d 私はなぜ=#{c1} =の代わりにSUM部分を変更しなければならなかったのかをよく知っています。それは私にエラーを与え続ける。 – KKK

+0

本当に、私のRubyのスキルは非常に限られています。 SQLをSQLに変換しようとしました。真実を伝えるために、この場合は2つのクエリが1より良いと思われます。そしてそれらはより速いかもしれません。 –

+0

または 'SELECT(SELECT ... query1)+(SELECT ... query2)'のようなものです。しかし、私はRoRを書く方法が全くわかりません(あるいはそれが可能であれば)。 –

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に接続すると、2つの属性(quantityunitprice_quantity)を持つオブジェクトが1つ戻されるはずです(コンソールのinspectの出力には表示されませんが、属性のハッシュを調べたり、

しかし、インデックスによっては、インデックスを効率的に使用できない可能性があるため、実際には速度が遅くなる可能性があります。 currency1_idの見た目の冗長状態は、[currency1_id, created_at]のインデックスを使用できることを意味します。前と後のベンチマークを行います - 時には2つの高速クエリが1つの低速クエリよりも優れています!

関連する問題