SELECT SUM(qty_shares*cost) AS out, user_id, stock_id, order_id
FROM table
WHERE transaction = 'B'
GROUP BY user_id, stock_id, order_id
それで:
SELECT SUM(qty_shares*cost) AS in, user_id, stock_id
FROM table
WHERE transaction = 'S'
GROUP BY user_id, stock_id, order_id
PHP:
$Margin = ($query2->in - $query1->out);
$Balance += $Margin;
すべてを1つのクエリで実行できますが、速度が重要な場合は、サブクエリよりも高速になる可能性があります。
編集:1株あたりの平均利益/損失の場合:
SELECT AVG(qty_shares/cost) AS price_per_share, transaction, user_id, stock_id
FROM table
GROUP BY transaction,user_id,stock_id
これにより、ユーザーごとの株式タイプごとに、トランザクションタイプごとに1株あたりの平均価格が返されます。したがって、トランザクションS行は販売された平均価格であり、トランザクションB行は購入された平均価格です。それらの違いは、平均的な利益または損失です。
SELECT
SUM(
qty_shares *
(
SELECT AVG(A.qty_shares/A.cost) AS price_per_share
FROM table AS A
WHERE A.transaction = table.transaction
AND A.user_id = table.user_id
AND A.stock_id = table.stock_id
)
), user_id, stock_id, order_id
FROM table
WHERE transaction = 'B'
GROUP BY user_id, stock_id, order_id
このクエリは、行ごとに販売された株式数に現在の1株あたりの平均価格を掛けたものを返し、取引ごとの平均証拠金を返します。販売証拠金はマイナスになります。ただし、クエリが遅くなる場合があります。この情報を出発点として使用し、アプリケーションに最適な方法を見つけることをお勧めします。