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/