当您选择行时,SQL 会单独查看每一行,除非使用“聚合函数”。例如,聚合是 sum()、count()、avg()、min() 和 max()。(还有更多,在许多供应商的 SQL 包中。)这就是为什么您最终在结果集中得到 A 的两个“副本”;SQL 单独显示它们中的每一个,因为它们是两个不同的行。相反,您可以使用这些函数来查找聚合值。
当 SQL 查看聚合时,它需要知道要检查哪些行。默认情况下,如果查询中使用的所有数量都是聚合的,它会查看所有行。例如,在您的示例中,Select Sum(Quantity) from SomeTable where Parameter1='x'
将返回40
, 列中与条件匹配的所有值的总和。
您正在寻找一组行的聚合,在这种情况下,是具有相同Unit
值的项目。要告诉 SQL,您需要告诉它如何使用Group By
子句定义组。正如 Bluefeet 的回答所指出的,这可以通过编写:
SELECT Unit, Sum(Quantity)
FROM SomeTable
WHERE Parameter1 = 'x'
GROUP BY Unit
作为一般指针,如果您想在不分组的情况下查找聚合和值,则查询将失败。例如,如果您不想将查询限制为 Parameter1='x',而是想查看与行关联的参数,您可能只想将其添加到选择列表中,SELECT Unit, Sum(Quantity), Parameter1...
然后运行查询。这是行不通的,因为 SQL 不知道要查看哪一行来查找参数。
如果需要,您可以按多列分组。如果需要更复杂的组,可以使用更多技巧。例如,您可以对 case 语句或行的函数进行分组,以查找所有偶数项目的总和,或超过 100 个单位的订单的平均订单大小。