2014-09-24 6 views
0

Я создал базу данных ставок, и я пытаюсь определить, кто из лучших и худших. Самый простой способ я решил сделать это получить сумму выигрыша пользователем и вычитать, что на величину суммы, они сделали ставкуВычитание нескольких строк из двух запросов sql

Мой первый SQL запрос

SELECT fromuser,SUM(itemsgiven::int) 
FROM transactions 
WHERE transtype='Bet Placed' 
GROUP BY fromuser 
ORDER BY 2 DESC 

Который возвращает этот

fromuser sum 
15228328 2689 
13896406 2634 
55954103 308 
37460340 64 
66589399 62 

Тогда мой второй запрос, чтобы определить общий выигрыш

SELECT touser,SUM(itemsgiven::float) 
FROM transactions 
WHERE transtype='Bet Won' 
GROUP BY touser 
ORDER BY 2 DESC 

которых г eturns это

touser  sum 
15228328 4387.515 
55954103 152.295 
13896406 120.285 
66589399 71.28 
37460340 56.925 

Мой вопрос: что это лучший способ, чтобы объединить эти вопросы, так что я могу иметь два столбца, один с идентификатором пользователя, а другой их общий выигрыш (или потери в игре). Я просмотрел несколько примеров, но часть, которая меня опрокинула, - это то, как вы можете убедиться, когда вы вычитаете две суммы, которые вы вычитаете из одного и того же идентификатора пользователя.

EDIT: Я использую PostgreSQL

+1

Вы используете mysql или postgres? Пожалуйста, выберите платформу, ваш ответ может зависеть от функциональности того или другого. – paqogomez

+0

Я использую postgresql – ark

ответ

1

Вы можете использовать этот запрос:

SELECT usr, SUM(subtotal) AS total 
FROM (
    SELECT fromuser AS usr, SUM(itemsgiven::int) AS subtotal 
    FROM  transactions 
    WHERE transtype='Bet Placed' 
    GROUP BY fromuser 

    UNION ALL 

    SELECT touser AS usr, -1*SUM(itemsgiven::float) AS subtotal 
    FROM  transactions 
    WHERE transtype='Bet Won' 
    GROUP BY touser 
) s 
GROUP BY usr 
ORDER BY 2 DESC 

are y ou sure about itemsgiven :: int, а затем itemsgiven :: float?

+0

Это работало только для того, чтобы удалить -1 * из второй суммы и перенести ее на первую. благодаря – ark

0

Вы можете сделать это с UNION:

SELECT user_id, SUM(itemsgiven) as total_itemsgiven 
FROM 
(
    SELECT fromuser user_id, - itemsgiven::int itemsgiven 
    FROM transactions 
    WHERE 'Bet Placed' 
    UNION 
    SELECT touser user_id, itemsgiven::int itemsgiven 
    FROM transactions 
    WHERE 'Bet Won' 

) t 
GROUP BY user_id 
ORDER BY 2 DESC 
+0

Нет, извините, это не сработало. Все, что было сделано, это дать мне результаты моего первого запроса sql, за исключением того, что общий результат является отрицательным результатом, например. это дало мне 15228328 и -2689 – ark

+0

Это можно решить с помощью sqlfiddle.com. – Bulat

+0

Вы не можете «GROUP BY touser», если 'touser' не находится в' SELECT' – Tony

0

Вы можете использовать UNION

SELECT * FROM 
(SELECT fromuser as a,SUM(itemsgiven::numeric) as b 
FROM transactions 
WHERE transtype='Bet Placed' 
GROUP BY fromuser 
UNION 
SELECT touser as a,SUM(itemsgiven::numeric) as b 
FROM transactions 
WHERE transtype='Bet Won' 
GROUP BY touser 
) c 
ORDER BY c.b DESC 
+0

Это близко, но оно дает мне оба выхода таблиц в одной таблице, а не разницу. например [link] (http://goo.gl/8aElCZ) – ark

+0

Я изменил UNION ALL с UNION – PlsqlDev

Смежные вопросы