乘以相同PK的值

时间:2017-04-17 21:07:57

标签: sql sql-server

我有下表:

+-----+------+
| qwe | asdd |
+-----+------+
| a   | 3    |
| a   | 4    |
| b   | 5    |
| b   | 6    |
+-----+------+

结果应该是这样的:

+-----+------+
| qwe | asdd |
+-----+------+
| a   | 12   |
| b   | 30   |
+-----+------+

我编写的代码可能只适用于实际的表,但如果我们添加一行或更多行,则效果不佳:

select qwe, (SUM(asd) - MIN(asd)) * MIN(asd) a from t
group by qwe

您如何建议我修改此代码以使其与此类表格一起正常工作?

+-----+------+
| qwe | asdd |
+-----+------+
| a   | 3    |
| b   | 4    |
| b   | 5    |
| a   | 6    |
| a   | 7    |
+-----+------+

得到这样的表:

+-----+------+
| qwe | asdd |
+-----+------+
| a   | 12   |
| b   | 126  |
+-----+------+

1 个答案:

答案 0 :(得分:3)

没有内置PRODUCT()功能。唉。

假设您的所有值都是正值,您可以执行以下操作:

select qwe, exp(sum(log(asdd))) as aggregate_product
from t
group by qwe;

注意:这可以扩展为处理0和负值。这只会在表达式中添加许多额外的东西,这隐藏了基本的逻辑。

为了防止零问题:

select qwe, coalesce(exp(sum(log(nullif(asdd, 0)))), 0) as aggregate_product

负数有点棘手。