2012-02-24 55 views
2

我想根据事务表来找出谁拥有最多的利润。 (顶部列表)使用MySQL创建顶级列表

 
Table: Transactions 

    +--------------+ 
    | id   | 
    +--------------+ 
    | buy_user_id | 
    +--------------+ 
    | sell_user_id | 
    +--------------+ 
    | amount  | 
    +--------------+ 
    | price  | 
    +--------------+ 

此表包含有关在两个人之间进行交易时发生的交易的信息。 “buy_user_id”是买方,而“sell_user_id”是卖方。

“金额”是指购买了多少股票,价格是以什么价格(以美元计算)。营业额是(金额*价格)。

我想弄清楚哪些用户的利润最高。如果你把利润总额减去总损耗,最终的结果应该是0

例如为:

 

    +---+---------+--------+ 
    | # | User ID | Profit | 
    +---+---------+--------+ 
    | 1 | 13  | +1200 | 
    +---+---------+--------+ 
    | 2 | 52  | +300 | 
    +---+---------+--------+ 
    | 3 | 29  | -500 | 
    +---+---------+--------+ 
    | 4 | 72  | -1000 | 
    +---+---------+--------+ 

建议?

下面是一个完整的例子,与事务表第一:

 

    +----+-------------+--------------+--------+-------+ 
    | id | buy_user_id | sell_user_id | amount | price | 
    +----+-------------+--------------+--------+-------+ 
    | 1 | 13   | 72   | 1000 | 0.01 | $10 paid by 13 for 1000 stocks (now 13 has $10 loss while 72 has $10 profit) 
    +----+-------------+--------------+--------+-------+ 
    | 2 | 72   | 13   | 1000 | 1.01 | $1010 paid by 72 for 1000 stocks (now 72 has $1000 loss while 13 has $1000 profit) 
    +----+-------------+--------------+--------+-------+ 
    | 3 | 13   | 72   | 500 | 0.02 | $10 paid by 13 for 500 stocks (now 72 has $990 loss while 13 has $990 profit) 
    +----+-------------+--------------+--------+-------+ 
    | 4 | 72   | 13   | 100 | 5.10 | $510 paid by 72 for 100 stocks (now 72 has $1500 loss while 13 has $1500 profit) 
    +----+-------------+--------------+--------+-------+ 
    | 5 | 29   | 13   | 400 | 1.25 | $500 paid by 29 for 400 stocks (now 29 has $500 loss while 13 has $2000 profit) 

这个例子应该产生这样的结果:

 

    +---+---------+--------+ 
    | # | User ID | Profit | 
    +---+---------+--------+ 
    | 1 | 13  | +2000 | 
    +---+---------+--------+ 
    | 2 | 72  | -1500 | 
    +---+---------+--------+ 
    | 3 | 29  | -500 | 
    +---+---------+--------+ 

什么是完成这一任务的最好方法是什么?这是有道理的吗?

我尝试:

SELECT sell_user_id as user_id, SUM(amount*price) as amount, 'sell' as type 
FROM exchange_transactions 
GROUP BY sell_user_id 
UNION 
SELECT buy_user_id as user_id, SUM(amount*price) as amount, 'buy' as type 
FROM exchange_transactions 
GROUP BY buy_user_id 
+0

那么,你有什么尝试?这不是很简单,但也不是很困难。您需要使用'GROUP BY'和一个聚合函数:'SUM()', – 2012-02-24 17:21:42

+0

嗯,我尝试了很多东西......这很接近,但我不知道如何完成它:SELECT sell_user_id as user_id,选择buy_user_id as user_id,SUM(金额*价格)作为金额,'buy'作为类型FROM'交易'GROUP BY buy_user_id – Warz 2012-02-24 17:28:19

+0

什么是'pair_id'?这不在表格定义中。 – 2012-02-24 17:30:34

回答

1
SELECT user_id 
    , SUM(profit) AS profit 
    , SUM(stock_balance) AS stock_balance 
FROM 
    (SELECT sell_user_id AS user_id 
      , +SUM(amount*price) AS profit 
      , -SUM(amount) AS stock_balance 
     FROM exchange_transactions 
     GROUP BY sell_user_id 
    UNION ALL 
     SELECT buy_user_id 
      , -SUM(amount*price) 
      , +SUM(amount) 
     FROM exchange_transactions 
     GROUP BY buy_user_id 
    ) AS tmp 
GROUP BY user_id 
ORDER BY profit DESC 
+0

谢谢,这正是我想要做的,但与stock_balance有什么交易?它在所有用户中显示为0。 – Warz 2012-02-24 17:50:54

+0

它计算他们购买的股票数量减去他们卖出的股票数量。我认为你可能想知道,如果某人出售的价格超过他购买的价格(从他以前的股票中购买),或者他购买的商品多于卖出(因此增加其股票存量)。这个计算中有一个错误,现在编辑。 – 2012-02-24 17:53:45

+0

是的,这确实是一个非常好的主意,非常感谢! – Warz 2012-02-24 17:58:06

0

我认为以下应该可以帮助你接近你所要寻找的:

SELECT USER_ID, SUM(AMOUNT) AS PROFIT_LOSS FROM 
(SELECT sell_user_id as user_id, 
    SUM(amount * price) as amount 
    FROM exchange_transactions 
    GROUP BY sell_user_id 
UNION 
SELECT buy_user_id as user_id, 
    SUM(amount * price * -1) as amount 
    FROM exchange_transactions 
    GROUP BY buy_user_id) 
ORDER BY PROFIT_LOSS DESC; 

分享和享受。

+0

您错过了外部查询中的另一个“GROUP BY user_id”。 – 2012-02-24 17:41:33