如何获得DISTINCT列A,使用列B的SUM?

时间:2012-07-13 11:02:09

标签: sql sql-server

我对编码比较陌生并试图寻找解决方案,但我不完全确定如何表达我的问题。什么是最简单的方法来实现我需要的结果,详见下面的示例?我正在使用MSSQL。

SELECT Unit, Quantity FROM SomeTable WHERE Parameter1 = 'x'

给我结果:

Unit | Quantity
---------------
a    | 10
b    | 10
c    | 10
a    | 10

这是我需要的结果:

Unit | Quantity
---------------
a    | 20
b    | 10
c    | 10

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

添加GROUP BY这样就可以了。

SELECT Unit, Sum(Quantity)
FROM SomeTable
WHERE Parameter1 = 'x'
GROUP BY Unit

答案 1 :(得分:0)

当您选择行时,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不知道要查找哪个行来查找参数。

如果需要,您可以按多列进行分组。如果需要更复杂的组,可以使用更多技巧。例如,您可以对案例陈述或行的函数进行分组,以查找所有偶数项目的总和,或者订单超过100个单位的平均订单大小。