聚合多组序功能

问题描述:

,我有以下的表格:聚合多组序功能

1 X 10 
2 X 30 
3 Y 5 
4 Y 2 
...etc 

我需要把它变成:

X 300 //(10 * 30) 
Y 10 //(5 * 2) 

所以我实际上是在寻找一种乘法函数的那我可以使用像sum,avg和东西......这是否存在球员?

例如:

select field2, **multiply**(field3) 
from t 
group by field2 

感谢

理想的情况下,访问SQL将有一个PRODUCT聚合函数可用,但事实并非如此。但是,我们可以通过记住我们了解学校对数(或不...),并记住它模拟的是原木和的反对数等于产品:

SELECT field2, EXP(Sum(LOG(Field3))) AS ProductOfField3 
FROM t 
GROUP BY Field2 

注意,而一个真正的PRODUCT功能只会针对一组返回0如果有任何零个值,该解决方案将失败如果有任何零个值,所以,要当心一点。另外,如果有任何负值,这种方法将不起作用。

为了解决零,我们可以这样做:

SELECT 
    field2, 
    EXP(Sum(LOG(IIf(Field3 = 0, 1, Field3)))) AS ProductOfField3, 
    MIN(ABS(Field3)) AS MinOfAbsField3 
FROM t 
GROUP BY Field2 

,然后不顾任何行,其中MinOfAbsField3为零ProductOfField3值(这表明含零一组,因此,“真正的”产品应被0

为了应对负值,我们可以进一步做到这一点:

SELECT 
    field2, 
    EXP(Sum(LOG(IIf(Field3 = 0, 1, ABS(Field3))))) AS ProductOfField3, 
    MIN(ABS(Field3)) AS MinOfAbsField3, 
    SUM(IIf(Field3 < 0, 1, 0)) AS SumOfNegativeIndicator 
FROM t 
GROUP BY Field2 

和解释中等的结果与这些规则:

  • 如果MinOfAbsField3为零,无视ProductOfField3该行 - 该产品是零
  • 否则,对于给定的行所需要的答案是ProductOfField3否定如果SumOfNegativeIndicator是奇数该行中
+0

谢谢AakashM。我尝试了这种方式,但它不起作用,它一直说“无效的过程调用”,我无法确定错误来自哪里。虽然我确信它不是来自我的查询的其余部分,似乎访问不喜欢EXP(Sum(LOG([X])))或其他。我最终使用了一个交叉表,因为我最多只有3列进行乘法运算,但我会将其留作未来需求。 – CoolStraw 2011-03-07 12:43:07

+0

@CoolStraw这是你将得到的错误,如果任何值为零(或负值)。我将更新以指示处理这种情况的一种方式 – AakashM 2011-03-07 12:55:14

+0

gotcha!谢谢 – CoolStraw 2011-03-07 13:11:54

您可以定义以下两种功能:

Public Function ResetProd() As Boolean 
    Call Prod(Null) 
    ResetProd = True 
End Function 

Public Function Prod(nNumber As Variant) As Double 
    Static nPrevNumber As Double 
    If IsNull(nNumber) Then 
     nPrevNumber = 1 
    Else 
     nPrevNumber = nPrevNumber * nNumber 
    End If 
    Prod = nPrevNumber 
End Function 

...并使用它们如下:

SELECT PROD(_column_for_wich_you_want_product_) FROM _your_table_ 
WHERE RESETPROD() 
+0

这在理论上看起来不错,但你真的尝试过吗?它并不适合我(某些行不止一次),主要是:它不会聚合。你不能使用GROUP BY。 – Andre 2017-04-01 14:36:23