Создание топлиста с MySQL - PullRequest
       35

Создание топлиста с MySQL

2 голосов
/ 24 февраля 2012

Я хотел бы выяснить, у кого больше всего прибыли на основе таблицы транзакций.(топлист)

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

Ответы [ 2 ]

1 голос
/ 24 февраля 2012
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 голосов
/ 24 февраля 2012

Я думаю, что следующее поможет вам приблизиться к тому, что вы ищете:

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;

Делитесь и наслаждайтесь.

...