从两个sql查询中减去多行

Posted

技术标签:

【中文标题】从两个sql查询中减去多行【英文标题】:Subtracting multiple rows from two sql queries 【发布时间】:2014-09-24 17:08:16 【问题描述】:

我创建了一个投注数据库,我正在尝试确定谁是最好的和最差的。我决定这样做的最简单方法是获取用户的奖金总和,然后减去他们下注的总金额

我的第一个 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

返回这个

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

我的问题是结合这些查询的最佳方式是什么,这样我就可以有两列,一列是用户 ID,另一列是他们的总赢(或输)。我查找了一些示例,但让我感到困惑的部分是,您如何确保在减去仅从同一用户 ID 中减去的两个总和时。

编辑:我正在使用 postgresql

【问题讨论】:

你用的是mysql还是postgres?请选择一个平台,您的答案可能取决于一个或另一个的功能。 我正在使用 postgresql 【参考方案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

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

【讨论】:

这项工作只需从第二个总和中删除 -1* 并将其移至第一个总和。谢谢【参考方案2】:

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

【讨论】:

不,抱歉,这似乎不起作用。它所做的只是给了我第一个 sql 查询的结果,除了 total 是否定结果,例如它给了我 15228328 和 -2689 如果touser 不在SELECT 中,则不能GROUP BY touser 您的事务表中有哪些字段?您能否将示例数据添加到问题中。 更新了代码,因为没有注意到交易中有两个用户ID【参考方案3】:

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

【讨论】:

这很接近,但它给了我一个表中的两个表的输出,而不是区别。例如link 我把 UNION ALL 改成了 UNION

以上是关于从两个sql查询中减去多行的主要内容,如果未能解决你的问题,请参考以下文章

DART SQL 如何从 Dart 中的 SQL 查询结果中读取多行值(多列)?

如何从具有多行的 SQL 查询中获取非字符串数组字段

多行总和和计算字段

将一张表中的多行合并到 SQL 查询结果集中的多列中

SQL Oracle中的减号查询

用于评估多行的 SQL 查询