2014-09-24 47 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 

其中r eturns這

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

我的問題是什麼是對這些查詢結合起來,所以我可以有兩列,一個與用戶ID和其他與它們的總獎金(或losings)的最佳方式。我查了一些例子,但是讓我絆倒的部分是你如何確定當你減去只從相同的用戶ID中減去的兩個總和。

編輯:我使用PostgreSQL

+1

你使用的是mysql還是postgres?請選擇一個平臺,您的答案可能取決於其中一個或另一個的功能。 – paqogomez 2014-09-24 17:11:57

+0

我正在使用postgresql – ark 2014-09-24 17:26:26

回答

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 

是y你確定itemsgiven :: int,然後itemsgiven :: float?

+0

這樣做只需從第二個和中移除-1 *並將其移至第一個。謝謝 – ark 2014-09-27 03:05:58

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 2014-09-24 17:47:27

+0

這可以通過sqlfiddle.com解決 – Bulat 2014-09-24 19:26:59

+0

如果'touser'不在'SELECT'中,你就不能'GROUP BY touser' – Tony 2014-09-24 20:46:11

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

這很接近,但它使我在兩個表中輸出的表格都沒有差異。例如[鏈接](http://goo.gl/8aElCZ) – ark 2014-09-24 21:26:21

+0

我用UNION更改了UNION ALL – PlsqlDev 2014-09-25 17:31:31