2010-10-13 96 views
1

我已經找到了解決這個問題的方法,但是如果其中一個列是子查詢,我如何將它包含在組中,或者我需要將它包含在組中。我會在這裏粘貼查詢。ORA-00979:不是GROUP BY表達式?

SELECT s.customerid, s.denomid, 
     (SELECT su.quantity 
     FROM stockupdations su 
     WHERE s.customerid = su.custid 
     AND s.denomid = su.denomid 
     AND s.curid = su.curid) AS cur_stock, c.name AS cus_name, d.denomname AS denom, 
     cur.curcode AS currency 
FROM stock s 
LEFT JOIN customers c 
ON  s.customerid = c.custid 
LEFT JOIN denomination d 
ON  d.denomid = s.denomid 
LEFT JOIN currency cur 
ON  cur.curid = s.curid 
GROUP BY s.denomid, s.customerid, c.name, d.denomname, cur.curcode 
ORDER BY s.customerid ASC 
+1

作爲'SUM','COUNT')? 你想達到什麼目的? 請張貼輸入/期望輸出。 – shahkalpesh 2010-10-13 19:24:08

+0

@shahkalpesh:結果與使用'DISTINCT'相同,只是更多的輸入 - 查看[AskTom瞭解更多信息](http://asktom.oracle.com/pls/asktom/f?p=100:11: 0 :::: P11_QUESTION_ID:32961403234212)。擁有GROUP BY子句不需要使用聚合函數。 – 2011-03-11 03:50:16

回答

0

WITH語句怎麼樣?

WITH tmp AS 
(
    SELECT s.customerid, s.denomid, 
      c.name AS cus_name, 
      d.denomname AS denom, 
      cur.curcode AS currency 
    FROM stock s 
    LEFT JOIN customers c 
    ON  s.customerid = c.custid 
    LEFT JOIN denomination d 
    ON  d.denomid = s.denomid 
    LEFT JOIN currency cur 
    ON  cur.curid = s.curid 
    GROUP BY s.denomid, s.customerid, c.name, d.denomname, cur.curcode 
    ORDER BY s.customerid ASC 
) 
SELECT tmp.customerid, tmp.denomid, 
     su.quantity, 
     tmp.cus_name, 
     tmp.denom, 
     tmp.currency 
FROM tmp 
INNER JOIN stockupdations su 
ON  tmp.customerid = su.custid 
AND tmp.denomid = su.denomid 
AND tmp.curid = su.curid 
+0

子選擇無法更改爲INNER JOIN,因爲如果基於條件在「STOCKUPDATIONS」表中沒有記錄,則子選擇將返回空值。這意味着您需要使用OUTER連接。 – 2011-03-11 04:05:21

0

您可以在from子句中使用你的「內部查詢」比對select

說我有一個客戶表和訂單表,

我能有這樣的事情

SELECT C.CUSTOMER_ID, COUNT(T.ORDER_ID) 
FROM CUSTOMERS C 
JOIN (SELECT CUSTOMER_ID, ORDER_ID, ORDER_DATE, ORDER_STATUS FROM ORDERS O WHERE O.STATUS <> 'DECLINED') T 
ON T.CUSTOMER_ID = C.CUSTOMER ID 
GROUP BY C.CUSTOMER_ID 

(這SQL僅僅是一個例子,我知道有更好的方法來寫這篇文章,但我想不出任何其他例子)

+0

子選擇無法更改爲INNER JOIN,因爲如果基於條件在「STOCKUPDATIONS」表中沒有記錄,則子選擇將返回空值。這意味着您需要使用OUTER連接。 – 2011-03-11 04:04:45

0

你不必一次做所有事情。嘗試將您的查詢分解爲多個部分。子查詢,分析函數或其他複雜的邏輯對於外部查詢看起來像簡單的行。你爲什麼要使用`當你不使用任何聚合函數GROUP BY`(例如(不要擔心性能,Oracle將重新寫它,做任何事情都是一步到位,如果它是有道理的。)

--Step 3 
select [simple values] 
from 
(
    --Step 2 
    select [insanity] 
    from 
    (
    --Step 1 
    select [madness] 
    from 
    [impossible joins] 
) 
) 
group by [simple values] 
相關問題