SQL GROUP BY before JOIN - 查询时的顺序

标签 sql

SELECT 
    Income.point, Income.date, SUM(out), SUM(inc)
FROM 
    Income 
LEFT JOIN
    Outcome ON Income.point = Outcome.point 
           AND Income.date = Outcome.date
GROUP BY 
    Income.point, Income.date

UNION

SELECT 
    Outcome.point, Outcome.date, SUM(out), SUM(inc)
FROM 
    Outcome 
LEFT JOIN
    Income ON Income.point = Outcome.point 
           AND Income.date = Outcome.date
GROUP BY 
    Outcome.point, Outcome.date;

我有这段代码,我想做的是在加入之前进行分组。 “假设我们有一个包含连接和分组的 SQL 查询。评估此类查询的标准方法是首先执行所有连接,然后执行分组操作。但是,执行分组可能是可能的-by early,即将group-by操作推过一个或多个join。早期分组可能通过减少参与join的数据量来降低查询处理成本。” 所以我需要解释如何做到这一点

本例中的练习如下:

Under the assumption that the income (inc) and expenses (out) of the money at each outlet (point) are registered any number of times a day, get a result set with fields: outlet, date, expense, income.

Note that a single record must correspond to each outlet at each date.

Use Income and Outcome tables.

最佳答案

试试这段代码

SELECT ip,id,ii,oo FROM
(SELECT I.point ip, I.date id, SUM(I.inc) ii FROM Income I GROUP BY I.point, I.date ) in1
LEFT JOIN
(SELECT O.point op, O.date od, SUM(O.out) oo FROM Outcome O GROUP BY O.point, O.date ) ou1 
ON op=ip AND od=id

UNION

SELECT ip,id,ii,oo FROM
(SELECT I.point ip, I.date id, SUM(I.inc) ii FROM Income I GROUP BY I.point, I.date ) in1
RIGHT JOIN
(SELECT O.point op, O.date od, SUM(O.out) oo FROM Outcome O GROUP BY O.point, O.date ) ou1 
ON op=ip AND od=id

也许有人也可以给它起个名字。我什至不知道您如何在括号中调用这些 SELECTS ... :-/

编辑

好吧,采用 Luis LL 的想法并将其与“早期分组”结合起来会得到以下结果:

SELECT COALESCE(ip,op) point,COALESCE(id,od) date,ii inc,oo out FROM
(SELECT point ip, date id, SUM(inc) ii FROM Income GROUP BY point, date ) in1
FULL OUTER JOIN
(SELECT point op, date od, SUM(out) oo FROM Outcome GROUP BY point, date ) ou1 
ON op=ip AND od=id

也许这样就可以了?

关于SQL GROUP BY before JOIN - 查询时的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18259750/

相关文章:

sql - 如何在 SQL Server 中创建真正的一对一关系

返回动态旋转数据的 SQL 函数

sql - 如何将单个选择插入到两个不同的表中?

java - 将java连接到数据库以制作登录表单

sql - 如何在没有任何备份的情况下将sql server数据库从一台服务器复制到另一台服务器

mysql - 使用 SQL GROUP BY 时,一个 'group' 可能有多个不同的值

sql - 有没有办法获取 SQL Server 中所有当前临时表的列表?

java - SQL 准备语句抛出有关语法的错误

php - 这个使用准备好的语句的 mysqli 代码对 SQL 注入(inject)安全吗?

mysql - 从一列中找到最大值并选择它们的行