从两个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查询中减去多行的主要内容,如果未能解决你的问题,请参考以下文章