从两个sql查询中减去多行

从两个sql查询中减去多行,sql,postgresql,Sql,Postgresql,我已经创建了一个投注数据库,我正试图确定谁是最好和最差的投注者。我决定做这件事的最简单的方法是得到一个用户的赢款总额,然后减去他们下注的总金额 我的第一个SQL查询是 SELECT fromuser,SUM(itemsgiven::int) FROM transactions WHERE transtype='Bet Placed' GROUP BY fromuser ORDER BY 2 DESC 哪个返回这个 fromuser sum 15228328 2689 1389640

我已经创建了一个投注数据库,我正试图确定谁是最好和最差的投注者。我决定做这件事的最简单的方法是得到一个用户的赢款总额,然后减去他们下注的总金额

我的第一个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
touser      sum
15228328    4387.515
55954103    152.295
13896406    120.285
66589399    71.28
37460340    56.925
然后我的第二个问题是确定总赢款

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

fromuser    sum
15228328    2689
13896406    2634
55954103    308
37460340    64
66589399    62
touser      sum
15228328    4387.515
55954103    152.295
13896406    120.285
66589399    71.28
37460340    56.925
我的问题是,组合这些查询的最佳方式是什么,这样我就可以有两列,一列显示用户id,另一列显示它们的总赢款(或输款)。我查了一些例子,但让我大吃一惊的是,当你减去两个只从同一个用户id中减去的总和时,你如何确定


编辑:我正在使用postgresql

您可以使用
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
你可以用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

您可以使用以下查询:

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

您确定itemsgiven::int和itemsgiven::float吗?

您使用的是mysql还是postgres?请选择一个平台,您的答案可能取决于其中一个平台的功能。我正在使用postgresqlNope抱歉,这似乎不起作用。它所做的只是给了我第一次sql查询的结果,除了总数为负的结果,例如,它给了我15228328和-2689。如果
touser
不在
SELECT
中,则您不能
groupbytouser
?您能为问题添加示例数据吗?更新了代码,因为没有注意到Transaction中有两个用户ID。这很接近,但它为我提供了一个表中两个表的输出,而不是差异。e、 g.我用UNION更改了UNION所有这项工作只需从第二笔金额中删除-1*并将其移动到第一笔金额。谢谢