2012-04-04 62 views
1

我是Oracle的新手,我想知道是否有人能告訴我我的GROUP BY表達式有什麼問題。我嘗試刪除GROUP BY中的幾列,但沒有任何工作。還有另外一個查詢,這個與UNION共享,但我刪除了這個,以減少閱讀。不是Oracle中的GROUP BY表達式錯誤

-- Selection Criteria: Date Range = 12/01/2011 to 12/31/2011; AO Transaction Fee = 4.95% 

    SELECT 
    SUBSTR(Transaction_Date,1,10) Transaction_Date 
, Item_Number 
, REGEXP_REPLACE(SUBSTR(Item_Or_Adj_Description,1,50) 
,'([^[:print:]])',' ') AS Item_Or_Adj_Desctription 
, Customer_Type 
, Document_ID 
, Dealer_ID 
, Sales_Type 
, Item_Quantity 
, Total_Fee 
, State_Fee 
, Transaction_Fee 
, AO_Fee 
, WDFW_Fee 

    FROM 
    ( 
    -- Sales Transactions 
    SELECT /*+ index(IT ITEM_X4) */ 
     TO_CHAR(IT.it_status_set_date - 2/24, 'MM/DD/YYYY') AS Transaction_Date, -- Pacific Time 
     TO_NUMBER(IT.ic_rcn) AS Item_Number, IT.it_descr AS Item_Or_Adj_Description, 
     DT.di_name AS Customer_Type, IT.it_docid AS Document_ID, IT.ag_id AS Dealer_ID, 
     CASE WHEN UPPER(IST.is_name) = 'ACTIVE' THEN 'SALE' ELSE IST.is_name END AS Sales_Type, 
     NVL(IT.it_quantity * CASE WHEN IT.is_id = 'AC' THEN 1 WHEN IT.is_id = 'DU' THEN 1 ELSE -1 END, 0) AS Item_Quantity, -- Dups = 1 
     NVL(IT.it_state_fee * CASE WHEN IT.is_id IN ('DC','SC') THEN -1.00 ELSE 1.00 END, 0.00) + 
    NVL(IT.it_other_fee * CASE WHEN IT.is_id IN ('DC','SC') THEN -1.00 ELSE 1.00 END, 0.00) AS Total_Fee, 
     NVL(IT.it_state_fee * CASE WHEN IT.is_id IN ('DC','SC') THEN -1.00 ELSE 1.00 END, 0.00) AS State_Fee, 
     NVL(IT.it_other_fee * CASE WHEN IT.is_id IN ('DC','SC') THEN -1.00 ELSE 1.00 END, 0.00) AS Transaction_Fee, 
     CASE WHEN IT.it_other_fee IS NULL OR IT.it_other_fee = 0.00 THEN 0.00 
     ELSE ROUND(IT.it_state_fee * CASE WHEN IT.is_id IN ('DC','SC') THEN -1.00 ELSE 1.00 END * (4.95/100), 2) 
     END AS AO_Fee, 
     CASE WHEN IT.it_other_fee IS NULL OR IT.it_other_fee = 0.00 THEN 0.00 
     ELSE (IT.it_other_fee * CASE WHEN IT.is_id IN ('DC','SC') THEN -1.00 ELSE 1.00 END) - 
      ROUND((IT.it_state_fee * CASE WHEN IT.is_id IN ('DC','SC') THEN -1.00 ELSE 1.00 END * (4.95/100)), 2) 
     END AS WDFW_Fee 
    FROM ITEM IT 
    JOIN DISCOUNT_TYPE DT ON DT.di_id = IT.di_id 
    JOIN ITEM_STATUS_TYPE IST ON IST.is_id = IT.is_id 
    WHERE IT.it_status_ind = 'A' -- Include active ITEM rows only. 
    AND (IT.is_id IN ('AC','DC','SC') OR (IT.is_id = 'DU' AND NVL(IT.it_state_fee, 0) != 0)) -- Exclude voids, exchanges, and false duplicates. 
    AND IT.ic_rcn != '999' -- Exclude Dealer Fees. 
    AND IT.it_status_set_date BETWEEN TO_DATE('12/01/2011 00:00:00', 'MM/DD/YYYY HH24:MI:SS') + 2/24 -- Pacific Time 
       AND TO_DATE('12/31/2011 23:59:59', 'MM/DD/YYYY HH24:MI:SS') + 2/24) 


    GROUP BY TO_DATE(SUBSTR(Transaction_Date,1,10), 'MM/DD/YYYY') 
      , Item_Number 
      , Item_Or_Adj_Description 
      ,Customer_Type 
      ,Document_ID 
      ,Dealer_ID 
      ,Sales_Type 
      ,Item_Quantity; 
      -- ,Total_Fee 
     -- ,State_Fee 
      -- ,Transaction_Fee 
     -- ,AO_Fee 
     -- ,WDFW_Fee 
+0

如果刪除GROUP BY中的TO_DATE位,它會工作嗎? – 2012-04-04 16:46:37

回答

2

看起來您在查詢中沒有進行任何聚合(您的SELECT列表中沒有任何列是類似COUNTMAX的聚合函數)。鑑於此,你應該完全刪除GROUP BY條款。

如果像phlogratos建議,你要使用一個GROUP BY消除重複,你做錯了什麼。最常見的問題是,查詢本身不應該生成重複的行,但某些連接條件或謂詞被遺漏導致行重複。如果是這種情況,那麼修復潛在的問題並添加缺少的謂詞或缺少的聯接會更好。如果你真的希望內聯視圖返回重複的行並且你想刪除它們,你最好不要使用SELECT DISTINCT <<list of columns>>而不要GROUP BY子句。

+1

如果沒有聚合函數,* group by *就像* distinct *語句,所以通過移除* group by *子句,您可能會多次獲得相同的結果。 – phlogratos 2012-04-04 16:59:35

+0

@phlogratos - 有趣的一點。如果這是意圖,那麼它幾乎肯定是一個錯誤。在絕大多數情況下,存在某種缺失的連接條件或缺少謂詞,需要添加以消除重複的行。如果實際上由於連接而預期有重複的行,則該語句在「SELECT」中應該有一個「DISTINCT」。 – 2012-04-04 17:06:38

2

你必須條款刪除列在選擇列表中,而不是在組,或者你可能在組由子句添加其他列。選擇列表中的所有列必須在組中由子句提及,或者必須是最小,最大或計數等集合函數。