2011-03-07 177 views
2

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

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 

感謝

回答

9

理想的情況下,訪問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

0

您可以定義以下兩種功能:

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