GROUP BY 子句将所有包含指定列中数据的行聚集在一起(这里 GroupBy 操作对列 L.ItemNo、L.Lot、L.Description 和 L.Quantity 执行)并允许聚合在一列或多列上执行的函数(这里聚合在L.PostingDate上完成)。
因此,每条具有不同列组合的记录,即L.ItemNo、L.Lot、L.Description 和L.Quantity,将与它的重复组合的聚合一起出现。例如,考虑您的示例:-
让我们假设您的表中有以下记录:-
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT789 2021-05-27 I789 Apple 45 L789
I789 LOT789 2021-05-29 I789 Apple 38 L789
I789 LOT789 2021-05-25 I789 Apple 45 L789
I789 LOT789 2021-05-28 I789 Apple 45 L789
I789 LOT789 2021-06-01 I789 Apple 38. L789
I789 LOT555 2021-06-01 I789 Apple 11. L555
因此,当您对Identifier、ItemNo、Description、Quantity 和 Lot 进行分组时,SQL 会理解您想要对这些列进行逻辑分组,并且它将划分数据并理解如下:-
-- Group 1
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT789 2021-05-27 I789 Apple 45 L789
I789 LOT789 2021-05-25 I789 Apple 45 L789
I789 LOT789 2021-05-28 I789 Apple 45 L789
-- Group 2
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT789 2021-05-29 I789 Apple 38 L789
I789 LOT789 2021-06-01 I789 Apple 38. L789
-- Group 3
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT555 2021-06-01 I789 Apple 11. L555
现在,当您在某个特定列上的这些记录上运行任何聚合函数时,它将尝试为遇到的每个逻辑分组运行聚合函数(如上所示,在这种情况下有 3 个)
因此,在我们的例子中,聚合函数是 Max(L.PostingDate),它将选择迄今为止已识别的每个组的最大日期记录,如下所示:-
-- Group 1
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT789 2021-05-28 I789 Apple 45 L789
-- Group 2
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT789 2021-06-01 I789 Apple 38. L789
-- Group 3
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT555 2021-06-01 I789 Apple 11. L555
现在最后它结合了所有记录并显示结果如下:-
-- Final Ouput
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT789 2021-05-28 I789 Apple 45 L789
I789 LOT789 2021-06-01 I789 Apple 38. L789
I789 LOT555 2021-06-01 I789 Apple 11. L555
这就是group by 的作用方式,所以在您的情况下,如果您不希望 group by 在quantity 列上发生,您可以简单地将其从 select 查询以及 groupBy 中删除,或者如果您包括 quantity 列以分组,它将继续打印具有不同列组合的记录。