首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查询时按联接前顺序对SQL进行分组

查询时按联接前顺序对SQL进行分组
EN

Stack Overflow用户
提问于 2013-08-15 19:01:17
回答 6查看 9.9K关注 0票数 3
代码语言:javascript
运行
复制
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查询。评估这类查询的标准方法是首先执行所有联接,然后再执行组--通过操作。然而,可以通过一个或多个联接后的操作来提前执行组。早期分组可以减少参与联接的数据量,从而降低查询处理成本。”所以我需要解释一下该怎么做

在这种情况下,练习如下:

假设每个出入口(点)的收入(公司)和支出(支出)是每天登记的任意次数,得到一个结果集与字段:出口,日期,费用,收入。 请注意,在每个日期,单个记录必须对应于每个出口。 使用收入和成果表。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-08-15 19:14:06

试试这段代码

代码语言:javascript
运行
复制
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的想法,并将其与“早期分组”相结合,您将得到以下信息:

代码语言:javascript
运行
复制
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

也许这能起作用?

票数 1
EN

Stack Overflow用户

发布于 2013-08-15 19:09:22

假设您需要在两个单独的表中注册这些数据(这不是最优雅的方法),那么您可以不用使用子查询。联合可能不是这样做的,因为这并不能将每个“点”的数据集放在一个记录中。

票数 0
EN

Stack Overflow用户

发布于 2013-08-15 19:14:58

我不知道你想实现什么,但我认为你需要的是FULL OUTER JOIN

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18259750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档