【问题标题】:Creating a toplist with MySQL使用 MySQL 创建一个顶级列表
【发布时间】:2012-03-15 03:35:41
【问题描述】:

我想根据交易表找出谁的利润最多。 (上榜)

表:交易 +---------------+ |编号 | +---------------+ |购买用户 ID | +---------------+ |销售用户 ID | +---------------+ |金额 | +---------------+ |价格 | +---------------+

此表包含有关在两个人之间交换期间发生的交易的信息。 “buy_user_id”是买家,“sell_user_id”是卖家。

“数量”是购买了多少股票,价格是什么价格(美元)。那么营业额就是(金额*价格)。

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

例如:

+---+----------+--------+ | # |用户名 |利润 | +---+----------+--------+ | 1 | 13 | +1200 | +---+----------+--------+ | 2 | 52 | +300 | +---+----------+--------+ | 3 | 29 | -500 | +---+----------+--------+ | 4 | 72 | -1000 | +---+----------+--------+

建议?

这是一个完整的例子,首先是事务表:

+----+-------------+--------------+--------+------ -+ |编号 |购买用户 ID |销售用户 ID |金额 |价格 | +----+-------------+--------------+--------+------ -+ | 1 | 13 | 72 | 1000 | 0.01 | 13 人为 1000 只股票支付了 10 美元(现在 13 人亏损 10 美元,而 72 人盈利 10 美元) +----+-------------+--------------+--------+------ -+ | 2 | 72 | 13 | 1000 | 1.01 | 72 为 1000 只股票支付了 1010 美元(现在 72 亏损 1000 美元,而 13 盈利 1000 美元) +----+-------------+--------------+--------+------ -+ | 3 | 13 | 72 | 500 | 0.02 | 13 人为 500 只股票支付了 10 美元(现在 72 人亏损 990 美元,而 13 人盈利 990 美元) +----+-------------+--------------+--------+------ -+ | 4 | 72 | 13 | 100 | 5.10 | 72 为 100 只股票支付了 510 美元(现在 72 亏损 1500 美元,而 13 盈利 1500 美元) +----+-------------+--------------+--------+------ -+ | 5 | 29 | 13 | 400 | 1.25 | 29 人为 400 只股票支付了 500 美元(现在 29 人亏损 500 美元,而 13 人盈利 2000 美元)

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

+---+----------+--------+ | # |用户名 |利润 | +---+----------+--------+ | 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

【问题讨论】:

  • 那么,您尝试过什么?这不是很简单,但也不是很困难。您需要使用 GROUP BY 和聚合函数:SUM(),
  • 好吧,我尝试了很多东西......这很接近,但我不确定如何完成它:SELECT sell_user_id as user_id, SUM(amountprice) as amount, 'sell' as type FROM transactions GROUP BY sell_user_id UNION SELECT buy_user_id as user_id, SUM(amountprice) as amount, 'buy' as type FROM transactions GROUP BY buy_user_id
  • 什么是pair_id?它不在表定义中。
  • 不要介意pair_id,它不相关(我删除了它)

标签: mysql select join union


【解决方案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 

【讨论】:

  • 谢谢,这正是我想要做的,但是 stock_balance 是怎么回事?它在所有用户中显示为 0。
  • 计算他们买入的股票数量减去卖出的股票数量。我想你可能想知道某人是否卖得比他买的多(从他以前持有的股票中),或者他买的比卖的多(因此增加他的股票库存)。计算中有一个错误,现在已编辑。
【解决方案2】:

我认为以下内容应该可以帮助您更接近您正在寻找的内容:

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;

分享和享受。

【讨论】:

  • 您在外部查询中错过了另一个GROUP BY user_id
猜你喜欢
  • 1970-01-01
  • 2018-09-09
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 2016-02-15
  • 1970-01-01
相关资源
最近更新 更多