2015-10-14 23 views
1

我有一個查詢,我在哪裏使用右表加入一個日期表,這意味着我得到所有的日期值。我只想在我的表結果集邊界之間有值。我有以下查詢Oracle拋出不是一個表達式組

Select DD.CAL_YEAR, DD.WEEK_OF_YEAR, Count(Distinct FPP.ID) As Total 
From FACT_PAY_PAYMENT FPP 
    Right Join DIM_DATE DD On FPP.REQUESTED_EXECUTION_DATE_ID = DD.ID 
Group By DD.CAL_YEAR, DD.WEEK_OF_YEAR 
Having DD.ID >= MIN(FPP.REQUESTED_EXECUTION_DATE_ID) 
    AND DD.ID <= MAX(FPP.REQUESTED_EXECUTION_DATE_ID); 

但是,當我執行此,我從Oracle獲得

Error: ORA-00979: not a GROUP BY expression

SQLState: 42000 ErrorCode: 979

以下錯誤什麼是錯誤的,我查詢?

回答

3

在您的查詢的問題是最後一條語句(having):

Select DD.CAL_YEAR, DD.WEEK_OF_YEAR, Count(Distinct FPP.ID) As Total 
    From FACT_PAY_PAYMENT FPP 
    Right Join DIM_DATE DD On FPP.REQUESTED_EXECUTION_DATE_ID = DD.ID 
    Group By DD.CAL_YEAR,DD.WEEK_OF_YEAR 
--->  Having DD.ID >= MIN(FPP.REQUESTED_EXECUTION_DATE_ID) AND DD.ID <= MAX(FPP.REQUESTED_EXECUTION_DATE_ID) 

事實上,其也應該在一個領域的應用包括在group by,這是不是DD.ID的情況。 因此,甲骨文抱怨與一個(現在的更清晰的)消息「(DD.ID是)not(中)a group by expression

一種可能的解決辦法,如果你的業務邏輯兼容,可以改變你的having子句簡單where條款:

Select DD.CAL_YEAR, DD.WEEK_OF_YEAR, Count(Distinct FPP.ID) As Total 
    From FACT_PAY_PAYMENT FPP 
    Right Join DIM_DATE DD On FPP.REQUESTED_EXECUTION_DATE_ID = DD.ID 
    Where DD.ID >= ... 
    And DD.ID <= ... 
    Group By DD.CAL_YEAR,DD.WEEK_OF_YEAR 

Here你可以找到的having VS where子句一個很好的解釋。

+0

確實,這工作。 –

0

您似乎想要全部最小值和最大值之間的日期值,即使是那些沒有匹配值的日期值。我猜測,按年份和星期幾的彙總只能從DD獲得少數幾個ID。因此,一種方法是:

Select DD.CAL_YEAR, DD.WEEK_OF_YEAR, Count(Distinct FPP.ID) As Total 
From DIM_DATE DD LEFT JOIN 
    FACT_PAY_PAYMENT FPP 
    On FPP.REQUESTED_EXECUTION_DATE_ID = DD.ID 
Group By DD.CAL_YEAR, DD.WEEK_OF_YEAR 
Having MAX(DD.ID) >= MIN(FPP.REQUESTED_EXECUTION_DATE_ID) AND 
     MIN(DD.ID) <= MAX(FPP.REQUESTED_EXECUTION_DATE_ID); 

然而,HAVING子句中這樣的過濾是白費力氣 - 查詢已經聚集了一切。這是一種獲得它在WHERE

Select DD.CAL_YEAR, DD.WEEK_OF_YEAR, Count(Distinct FPP.ID) As Total 
From DIM_DATE DD LEFT JOIN 
    FACT_PAY_PAYMENT FPP 
    On FPP.REQUESTED_EXECUTION_DATE_ID = DD.ID CROSS JOIN 
    (SELECT MIN(FPP.REQUESTED_EXECUTION_DATE_ID) as minredi, 
      MAX(FPP.REQUESTED_EXECUTION_DATE_ID) as maxredi 
     FROM FACT_PAY_PAYMENT 
    ) minmax 
Where DD.ID >= minmax.minredi AND DD.ID <= minmax.maxredi 
Group By DD.CAL_YEAR, DD.WEEK_OF_YEAR; 
相關問題