2012-04-04 63 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

你必须条款删除列在选择列表中,而不是在组,或者你可能在组由子句添加其他列。选择列表中的所有列必须在组中由子句提及,或者必须是最小,最大或计数等集合函数。