我有这两张表
table1 : date | uid | value_in
table2 : date | uid | value_out
每天,无论交易/记录的数量如何,每个uid都将接收入和出的余额值
我想做的就是结合查询结果像这样
date | uid | value_in | value_out | (value_in-value_out) as balance
但是,当我执行此查询时
SELECT
a.date,
a.uid,
SUM(a.value_in),
SUM(b.value_out),
(SUM(a.value_in)-SUM(b.value_out)) AS balance
FROM table1 a
INNER JOIN table2 b ON a.date=b.date AND a.uid=b.uid
GROUP BY a.date, a.uid
它产生无效的结果(SUM是两倍或三倍),我应该如何修改查询以使其不会产生两倍的结果?
首先建立总和,然后加入。像这样:
SELECT i.uid
,i.date
,i.v_in
,COALESCE(o.v_out, 0) AS v_out
,(i.v_in - COALESCE(o.v_out, 0)) AS balance
FROM (
SELECT date
,uid
,SUM(value_in) AS v_in
FROM table1
GROUP BY 1,2
) i
LEFT JOIN (
SELECT date
,uid
,SUM(value_out) AS v_out
FROM table2
GROUP BY 1,2
) o USING (date, uid)
您拥有的方式,每一个value_in
都会与每个匹配项结合在一起value_out
,从而使数字相乘。您必须先进行汇总,然后再将 一个 总和与
一个 总和结合在一起,否则一切都会变得古怪。还是吗?
如果没有给定的value_in
或value_out
给定的会发生什么(date,uid)
?还是只有value_in
还是只是value_out
?您的查询将失败。
我通过使用LEFT JOIN
而不是进行了改进[INNER] JOIN
,但是您真正想要的是FULL OUTERJOIN
-MySQL中缺少的功能之一。
您可以提供一个单独的表天,清单LEFT JOIN
两个表到它,或者你可以解决缺少的功能,以两次LEFT JOIN
和UNION
。请参阅此处的示例。
或者, 你可以增加你value_out
的-1
UNION两个表一起,构建一个总和。
但是,如果没有任何一天或一天,您 仍然 不会连续一天,这违反了您的描述。value_in``value_out
因此, 唯一干净的解决方案 是(date, uid)
在结果中加上所需的所有LEFT JOIN
内容table1
以及table2
与之和的表,或者在子选择中包含UNION ALL
三个(负数table2
)的表,然后进行汇总。
本文向大家介绍详解MySQL子查询(嵌套查询)、联结表、组合查询,包括了详解MySQL子查询(嵌套查询)、联结表、组合查询的使用技巧和注意事项,需要的朋友参考一下 一、子查询 MySQL 4.1版本及以上支持子查询 子查询:嵌套在其他查询中的查询。 子查询的作用: 1、进行过滤: 实例1:检索订购物品TNT2的所有客户的ID = + 一般,在WHERE子句中对于能嵌套的子查询的数目没有限制,不过在
问题内容: 我有两个要与之进行内部联接的表。 一个是主键为的表。 另一个表是外键在哪里。也有一个列,其中where是表的外键。 我正在尝试汇总一个ActiveRecord查询,在这里我可以选择N天前或之前创建的所有用户,并且其中任何一个都没有等于特定ID的用户。我试图做这样的事情: 此查询字段超过30,000个结果,这是不正确的,因为Users表仅具有12,000行。 我到底在做什么错? 问题答案
问题内容: 我绝对是SQL的新手,我一直在努力用Postgresql中的以下表结构编写一个复杂的查询: 查询的目的是获取每个用户的报告类型数量,并将其显示在一列中。有三种不同类型的报告。 使用group-by的简单查询将解决问题,但将其显示在不同的行中: 问题答案:
问题内容: 上面的查询返回如下结果, 此查询用于计算所有者拥有的传输数量。琳达有一辆汽车和一辆摩托车,所以结果应该是: 我已经尝试过此查询,但返回错误: 谁能帮我吗? 问题答案:
问题内容: 我有这个查询: 在访问时执行此查询时,出现“语法错误”。你有看错吗? 谢谢 问题答案: 您可以使用a来对更新查询中的其他表求和。具有聚合的子查询将无法工作,因为它们不可更新。
问题内容: 有人可以帮助我了解此查询的问题吗: 问题答案: 之所以无法使用,是因为MySQL不按照您尝试的方式在delete语句中支持连接语法。 使用: …或使用EXISTS: