2016-04-23 4 views
2

せずに、このクエリを構築する私は、フォーム内のトランザクション・ログ表を持っている:私はこれらの取引に基づいて、現在の残高を表示するビューを構築しようとしていますMySQLは:副選択

| id | date  | type | symbol | volume | unit_price | user_id | 
| 1 | 2016-01-01 | BUY | AAPL | 100 | 100.00  | a  | 
| 2 | 2016-01-02 | SELL | AAPL | 50  | 110  | a  | 

。フォームで何か:

| user_id | symbol | total_volume | value | 

は、これまでのところ私が持っている:これは私が必要なものを私を取得しますが、私は理由を選択し、サブのビューとしてこれを作成することはできません

SELECT 
    t.user_id, 
    t.symbol, 
    sum(t.volume * t.multiplier) as total_volume, 
    sum(t.volume * t.unit_price * t.multiplier) as value 
FROM (
    SELECT 
     *, 
     CASE type 
      WHEN 'SELL' THEN -1 
      WHEN 'BUY' THEN 1 
     END as multiplier 
    FROM transaction 
) t 
GROUP BY t.user_id, t.symbol; 

。私がこれを行うことができ、それをビューとして作成することができる別の方法がありますか?

+0

あなたが作るしようとしたときにどのようなエラーを取得していますビューにこのクエリ? – Mureinik

+0

@Mureinikビューを作成している間は一般的な「エラー」がありますが、MySqlではビューのサブクエリが許可されている可能性が高いので、 – Edd

+1

トランザクションテーブルへの参照でインラインビュークエリを置き換えてください。 そして、 't.multiplier'への参照をCASE式で置き換えてください。それが必須であろうとなかろうと、それはより良いパフォーマンスをもたらすはずです。 – spencer7593

答えて

3

だけsumで条件を使用します。

SELECT t.user_id, t.symbol, 
     sum(case when t.type = 'SELL' then - volume 
       when t.type = 'BUY' then volume 
      end) 
     ) as total_volume, 
     sum(t.volume * t.unit_price * 
      (case when t.type = 'SELL' then -1 
       when t.type = 'BUY' then 1 
      end)) as value 
FROM transaction t 
GROUP BY t.user_id, t.symbol; 

typeのみ2つの値を取る場合、あなたはこれを簡素化することができます。

SELECT t.user_id, t.symbol, 
     sum(case when t.type = 'SELL' then -t.volume else t.volume end) as total_volume, 
     sum(t.volume * t.unit_price * 
      (case when t.type = 'SELL' then -1 else 1 end) 
      end)) as value 
FROM transaction t 
GROUP BY t.user_id, t.symbol; 
+0

他のすべての列参照と同様に、\ 'type \ 'に対する修飾されていない参照が修飾されていることをお勧めします。 ** + 10 **。ケースの「検索」フォーム... **「ケース1。タイプ1」を購入したときに「売ります」を入力します。猫の皮膚を作る方法はたくさんあります。ちょうどいくつかの方法は他のものよりもずっと面倒です。 – spencer7593

+0

'where total_volume!= 0'句を追加する簡単な方法はありますか? – Edd

+1

@ Ed0906。 ..それは 'group by'の後に' total_volume <> 0'を持つでしょう。 –