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