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查询。评估这类查询的标准方法是首先执行所有联接,然后再执行组--通过操作。然而,可以通过一个或多个联接后的操作来提前执行组。早期分组可以减少参与联接的数据量,从而降低查询处理成本。”所以我需要解释一下该怎么做
在这种情况下,练习如下:
假设每个出入口(点)的收入(公司)和支出(支出)是每天登记的任意次数,得到一个结果集与字段:出口,日期,费用,收入。 请注意,在每个日期,单个记录必须对应于每个出口。 使用收入和成果表。
发布于 2013-08-15 19:14:06
试试这段代码
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
也许有人也能给它起个名字。我甚至不知道如何在括号中调用这些选择.
编辑
那么,根据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
也许这能起作用?
发布于 2013-08-15 19:09:22
假设您需要在两个单独的表中注册这些数据(这不是最优雅的方法),那么您可以不用使用子查询。联合可能不是这样做的,因为这并不能将每个“点”的数据集放在一个记录中。
发布于 2013-08-15 19:14:58
我不知道你想实现什么,但我认为你需要的是FULL OUTER JOIN
SELECT
ISNULL(Income.point, OutCome.point) AS Point, ISNULL(Income.date, OutComeDate) AS [date], SUM(out) AS Expenses, SUM(inc) AS Income
FROM Income
FULL OUTER JOIN Outcome
ON Income.point = Outcome.point AND Income.date = Outcome.date
GROUP BY Income.point, Income.date
https://stackoverflow.com/questions/18259750
复制相似问题