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

SQL GROUP BY before JOIN-查询时的序列,sql,Sql,我有这个代码,我想做的是加入前分组。 假设我们有一个包含联接和group by的SQL查询。评估此类查询的标准方法是首先执行所有连接,然后执行GROUPBY操作。然而,可以提前执行分组,也就是说,通过一个或多个联接推动分组操作。早期分组可以通过减少参与联接的数据量来降低查询处理成本。 所以我需要解释怎么做 在这种情况下,练习如下: 假设每个出口点的收入和支出每天登记任意次数,则得到一个包含以下字段的结果集:出口、日期、支出、收入 请注意,每个日期的每个门店都必须有一条记录 使用收入和结果表 如果

我有这个代码,我想做的是加入前分组。 假设我们有一个包含联接和group by的SQL查询。评估此类查询的标准方法是首先执行所有连接,然后执行GROUPBY操作。然而,可以提前执行分组,也就是说,通过一个或多个联接推动分组操作。早期分组可以通过减少参与联接的数据量来降低查询处理成本。 所以我需要解释怎么做

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

假设每个出口点的收入和支出每天登记任意次数,则得到一个包含以下字段的结果集:出口、日期、支出、收入

请注意,每个日期的每个门店都必须有一条记录

使用收入和结果表


如果我正确理解你的问题,你可以使用CTE

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;

如果我正确理解你的问题,你可以使用CTE

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;

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

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

试试这段代码

WITH CTE
AS
(
    SELECT [point]
    ,      [date]
    ,      [SumOut] = SUM([out])
    ,      [SumInc] = SUM([inc])
    FROM Income 
    GROUP BY [point], [date]
)

SELECT CTE.[Point]
,      CTE.[Date]
,      CTE.[SumOut]
,      CTE.[SumInc]
FROM CTE
LEFT JOIN Outcome ON CTE.[point] = Outcome.point AND CTE.[date] = Outcome.[date]
也许有人也能给它起个名字。我甚至不知道你怎么用括号来称呼这些选择…:-/

编辑

好吧,将路易斯·威尔的想法与早期分组相结合,可以得到以下结果:

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
也许这样就可以了?

试试下面的代码

WITH CTE
AS
(
    SELECT [point]
    ,      [date]
    ,      [SumOut] = SUM([out])
    ,      [SumInc] = SUM([inc])
    FROM Income 
    GROUP BY [point], [date]
)

SELECT CTE.[Point]
,      CTE.[Date]
,      CTE.[SumOut]
,      CTE.[SumInc]
FROM CTE
LEFT JOIN Outcome ON CTE.[point] = Outcome.point AND CTE.[date] = Outcome.[date]
也许有人也能给它起个名字。我甚至不知道你怎么用括号来称呼这些选择…:-/

编辑

好吧,将路易斯·威尔的想法与早期分组相结合,可以得到以下结果:

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

也许这样就行了?

我不知道你想要实现什么,但我认为你需要的是完全的外部连接


我不知道你想要实现什么,但我认为你需要的是完全的外部连接

从中选择一个* 选择Income.point、Income.date、SUMout、SUMinc 从…起 收入 左连接 关于收入的结果.point=结果.point 和Income.date=output.date 分组 收入点,收入日期

联合

从中选择B.* 选择output.point、output.date、SUMout、SUMinc 从…起 结果 左连接 Income.point上的收入=output.point 和Income.date=output.date 分组 结果点,结果日期B

从中选择一个*
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
选择Income.point、Income.date、SUMout、SUMinc 从…起 收入 左连接 关于收入的结果.point=结果.point 和Income.date=output.date 分组 收入点,收入日期

联合

从中选择B.* 选择output.point、output.date、SUMout、SUMinc 从…起 结果 左连接 Income.point上的收入=output.point 和Income.date=output.date 分组
结果点,结果日期B

我不确定我是否明白你想要什么。您可以尝试为您的问题添加更多详细信息吗?如果您需要更改结果的顺序,您需要添加一个ORDER BY子句。从SELECT point中选择point、date、SUMout、SUMinc,date、out、NULL as inc FROM OUTPUT UNION所有SELECT point、date、NULL as out、inc FROME s GROUP BY point,日期:我不确定我是否理解您的要求。您可以尝试为您的问题添加更多详细信息吗?如果您需要更改结果的顺序,您需要添加一个ORDER BY子句。从SELECT point中选择point、date、SUMout、SUMinc,date、out、NULL as inc FROM OUTPUT UNION所有SELECT point、date、NULL as out、inc FROME s GROUP BY point,日期:所以我认为子查询的工作不是按顺序进行的BY@NikolaMarkovinovi谢谢你!但从上面看,我认为路易斯·威尔的完全外接解决方案似乎比我尝试的联盟要优雅得多。@NikolaMarkovinović谢谢!但从上面看,我认为Luis LL的解决方案与完全外部连接似乎比我尝试的联盟更优雅。
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